Go每日一题(35) 的题目如下

3953 次点击 · 3 赞 ·大约8小时之前 开始浏览   · 来源「Golang来啦」

下面这段代码输出什么以及原因?

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
3953 阅读
39 回复
xwszt
xwszt · #1 · 3年之前

如果是

 h:=hello()

答案就应该是A

函数hello复制给h,h得到的不是hello函数的返回值,所以答案是B

lywoody
lywoody · #2 · 3年之前

这里的f应该是一个函数引用(指针 或者 地址吧) not nil %!t(func() []string=0x10a4900)%

TimLiuDream
TimLiuDream · #3 · 3年之前

mark

leech223
leech223 · #4 · 3年之前

mark

xumamba
xumamba · #5 · 3年之前

即使是接收了函数返回值,那 nil 和 有类型的nil((【】string)nil) 为什么直接就相等呢?

summers
summers · #6 · 3年之前

image.png

变量 h 类型不是 []string, 而是 func() []string。所以 not nil

xwszt
xwszt · #7 · 3年之前

hello()返回值类型是[]string,是slice类型。golang中两个slice类型是不可比较的,但是slice可以跟nil比较。[]string的零值是nil

    var a []string
    fmt.Printf("%T \t %v \t %v\n", a, a, a == nil) // []string         []      true

    var b = make([]string, 0)
    fmt.Printf("%T \t %v \t %v\n", b, b, b == nil) // []string         []      false
        fmt.Printf("%v\n", a == b)  // Invalid operation: a == b (the operator == is not defined on []string)
gonglf
gonglf · #8 · 3年之前

函数 hello 可以赋值给变量 h

Natsuwau
Natsuwau · #9 · 3年之前

打卡

mingtop
mingtop · #10 · 3年之前

h := hello 是函数指针故不为 nil

brothersam
brothersam · #11 · 3年之前

B 因为 h := hello 表示h是这个函数本身,h := hello() 才表示是这个函数的返回值。

wzbwzt
wzbwzt · #12 · 3年之前

+1

henry1
henry1 · #13 · 3年之前

打卡

gobanger
gobanger · #14 · 3年之前
mingtopmingtop #10 回复

h := hello 是函数指针故不为 nil

赞,可以调用函数就是nil

_Aiden_
_Aiden_ · #15 · 3年之前

打卡

mingtop
mingtop · #16 · 3年之前

Go 中函数是一等公民

WSMG
WSMG · #17 · 3年之前

mark

feiyang
feiyang · #18 · 3年之前

打卡

mingliangge
mingliangge · #19 · 3年之前

打卡

18328048335
18328048335 · #20 · 3年之前

审题啊哈哈哈,h是hello还是hello()

feiyang
feiyang · #21 · 2年之前

是将函数 hello 赋值给变量 h,而不是函数的返回值(即不是进行函数调用),所以输出 not nil。注意 Go 中函数是一等公民。

huangyf168
huangyf168 · #22 · 2年之前

mark

euibieur894
euibieur894 · #23 · 2年之前

打卡

Dessert
Dessert · #24 · 2年之前

将函数 hello 赋值给变量

Ysmword
Ysmword · #25 · 2年之前

第一次见这种函数赋值方式,长见识勒

feiyang
feiyang · #26 · 2年之前

这道题目里面,是将函数 hello 赋值给变量 h,而不是函数的返回值(即不是进行函数调用),所以输出 not nil。注意 Go 中函数是一等公民。

wzbwzt
wzbwzt · #27 · 2年之前

1

Zuos
Zuos · #28 · 2年之前

mark

528548004
528548004 · #29 · 2年之前

mark

hasbug
hasbug · #30 · 2年之前

mark

YuPeng
YuPeng · #31 · 2年之前

打卡

1174en
1174en · #32 · 2年之前

m

zhangwei_go
zhangwei_go · #33 · 大约1年之前

如果是

h:=hello() 答案就应该是A

函数hello复制给h,h得到的不是hello函数的返回值,所以答案是B

BigBigGopher
BigBigGopher · #34 · 大约1年之前

mk

Qmfuser
Qmfuser · #35 · 大约1年之前

mark

YuPeng
YuPeng · #36 · 大约1年之前

mark

1174en
1174en · #37 · 大约1年之前

m

BigBigGopher
BigBigGopher · #38 · 11月之前

mk

YuPeng
YuPeng · #39 · 7月之前

mark

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传