在Golang中,nil接收器在方法中的行为是什么?

huangapple go评论114阅读模式
英文:

Behaviour of nil receiver in method in Golang

问题

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type I interface {
  6. M()
  7. }
  8. type T struct {
  9. }
  10. func (t *T) M() {
  11. fmt.Println(t == nil)
  12. }
  13. func main() {
  14. var i I
  15. var t *T
  16. i = t
  17. fmt.Println(i == nil)
  18. i.M()
  19. }

结果是 falsetrue

在两种情况下,值都是 nil,类型是 *main.T

我理解在第一种情况下,i == nilfalse,因为变量 i 没有 nil 类型。

我不理解为什么在方法 M() 内部,t == niltrue

英文:
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type I interface {
  6. M()
  7. }
  8. type T struct {
  9. }
  10. func (t *T) M() {
  11. fmt.Println(t == nil)
  12. }
  13. func main() {
  14. var i I
  15. var t *T
  16. i = t
  17. fmt.Println(i == nil)
  18. i.M()
  19. }

The result is false and true.

The value in both cases is nil and type is *main.T.

I understand that in the first case i == nil is false because the variable i does not have a nil type.

I do not understand why t == nil is true inside the method M().

答案1

得分: 8

在第一个情况下,i==nil是false,因为i是一个类型为T且值为nil的接口。要使接口等于字面值nil,它必须同时具有类型和值为nil。在这里,i具有非nil的类型。

在第二个情况下,接收器只是nil,因为函数M的接收器是一个类型为*T且值为nil的值。

英文:

In the first case, i==nil is false, because i is an interface whose type is T and whose value is nil. For an interface to be equal to the literal value nil, it has to have both type and value nil. Here, i has non-nil type.

In the second case, the receiver is simply nil, because the receiver of the function M is a value of type *T whose value is nil.

huangapple
  • 本文由 发表于 2021年9月30日 08:51:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/69384852.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定