有如下代码片段,其中的下划线 _ 是啥作用:
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 // 必须显式返回零值
}
这种写法主要是为了代码简洁,避免在函数末尾显式声明和返回零值。