下面这段代码输出什么以及原因?
func hello() []string {
return nil
}
func main() {
h := hello
if h == nil {
fmt.Println("nil")
} else {
fmt.Println("not nil")
}
}
- A. nil
- B. not nil
- C. compilation error
下面这段代码输出什么以及原因?
func hello() []string {
return nil
}
func main() {
h := hello
if h == nil {
fmt.Println("nil")
} else {
fmt.Println("not nil")
}
}
`单行代码`
如果是
答案就应该是A
函数hello复制给h,h得到的不是hello函数的返回值,所以答案是B
这里的f应该是一个函数引用(指针 或者 地址吧) not nil %!t(func() []string=0x10a4900)%
mark
mark
即使是接收了函数返回值,那 nil 和 有类型的nil((【】string)nil) 为什么直接就相等呢?
变量 h 类型不是 []string, 而是 func() []string。所以 not nil
hello()返回值类型是[]string,是slice类型。golang中两个slice类型是不可比较的,但是slice可以跟nil比较。[]string的零值是nil
函数 hello 可以赋值给变量 h
打卡
h := hello 是函数指针故不为 nil
B 因为 h := hello 表示h是这个函数本身,h := hello() 才表示是这个函数的返回值。
+1
打卡
赞,可以调用函数就是nil
打卡
Go 中函数是一等公民
mark
打卡
打卡
审题啊哈哈哈,h是hello还是hello()
是将函数 hello 赋值给变量 h,而不是函数的返回值(即不是进行函数调用),所以输出 not nil。注意 Go 中函数是一等公民。
mark
打卡
将函数 hello 赋值给变量
第一次见这种函数赋值方式,长见识勒
这道题目里面,是将函数 hello 赋值给变量 h,而不是函数的返回值(即不是进行函数调用),所以输出 not nil。注意 Go 中函数是一等公民。
1
mark
mark
mark
打卡
m
如果是
h:=hello() 答案就应该是A
函数hello复制给h,h得到的不是hello函数的返回值,所以答案是B
mk
mark
mark
m
mk
mark