不灭的火

加密类型:SHA/AES/RSA下载Go
复合类型:数组(array)、切片(slice)、映射(map)、结构体(struct)、指针(pointer、函数(function)、接口(interface)、通道(channel) Go类型
引用类型:切片(slice)、映射(map)、指针(pointer、函数(function)、通道(channel) Go引用

作者:AlbertWen  添加时间:2025-11-17 01:10:29  修改时间:2025-11-17 17:14:53  分类:02.Go语言编程  编辑

有如下代码片段,其中的下划线 _ 是啥作用:

package iterx

import (
  "iter"
  "slices"
)

type SliceSeq[E any] struct {
  seq iter.Seq2[int, E]
}

func (s SliceSeq[E]) Find(equal func(int, E) bool) (_ E) {
  for i, v := range s.seq {
    if equal(i, v) {
      return v
    }
  }
  return
}

 

在这个 Go 代码段中,_ 有两个作用:

1. 命名返回值

func (s SliceSeq[E]) Find(equal func(int, E) bool) (_ E) {

这里的 _ E 表示函数有一个类型为 E 的命名返回值,但标识符是 _(下划线),这意味着:

  • 函数声明了一个返回值变量
  • 但由于使用 _,这个变量在函数体内无法被引用或访问
  • 仍然可以使用裸 return 语句返回该类型的零值

2. 裸 return 语句

return

由于有命名返回值,return 语句可以不带参数,这时会返回命名返回值的当前值。但由于命名返回值是 _,无法显式赋值,所以这里返回的是类型 E 的零值。

等价写法对比

当前代码:

func (s SliceSeq[E]) Find(equal func(int, E) bool) (_ E) {
  for i, v := range s.seq {
    if equal(i, v) {
      return v  // 显式返回 v
    }
  }
  return       // 返回 E 的零值
}

等价的【有名返回值】的写法:

func (s SliceSeq[E]) Find(equal func(int, E) bool) (result E) {
  for i, v := range s.seq {
    if equal(i, v) {
      return v
    }
  }
  return // 返回 result(E 的零值)
}

等价的【无命名返回值】的写法:

func (s SliceSeq[E]) Find(equal func(int, E) bool) E {
  for i, v := range s.seq {
    if equal(i, v) {
      return v
    }
  }
  var zero E
  return zero  // 必须显式返回零值
}

这种写法主要是为了代码简洁,避免在函数末尾显式声明和返回零值。