英文:
Type declaration importance in golang, nil values
问题
我有一个小的 Golang 测试,我无法理解:
package main
import "fmt"
type myObj struct {
}
func nilObj() *myObj {
return nil
}
func nilInt() interface{} {
return nil
}
func main() {
var obj1 interface{}
fmt.Println(obj1 == nil) // true
obj1 = nilObj()
fmt.Println(obj1 == nil) // false
var obj2 *myObj
fmt.Println(obj2 == nil) // true
obj2 = nilObj()
fmt.Println(obj2 == nil) // true
var obj3 interface{}
fmt.Println(obj3 == nil) // true
obj3 = nilInt()
fmt.Println(obj3 == nil) // true
}
在 obj1
和 obj2
之间,只有变量声明不同,但结果不同。
在 obj1
和 obj3
之间,函数调用返回的类型不同(结构体指针 vs 接口)。我不完全确定我理解结果的方式。
任何帮助都是受欢迎的(https://play.golang.org/p/JcjsJ-_S8I)
英文:
I have this small golang test I cannot understand:
package main
import "fmt"
type myObj struct {
}
func nilObj() *myObj {
return nil
}
func nilInt() interface{} {
return nil
}
func main() {
var obj1 interface{}
fmt.Println(obj1 == nil) // true
obj1 = nilObj()
fmt.Println(obj1 == nil) // false
var obj2 *myObj
fmt.Println(obj2 == nil) // true
obj2 = nilObj()
fmt.Println(obj2 == nil) // true
var obj3 interface{}
fmt.Println(obj3 == nil) // true
obj3 = nilInt()
fmt.Println(obj3 == nil) // true
}
Between obj1 and obj2, only the variable declaration changes, but the result is different.
Between obj1 and obj3, the function call does not return the same type (struct pointer vs interface). I am not entirely sure I understand the result.
Any help is welcome (https://play.golang.org/p/JcjsJ-_S8I)
答案1
得分: 1
在底层,接口由两个元素实现,一个是类型(type),一个是值(value)。值被称为接口的动态值(dynamic value),它是一个任意的具体值,而类型则是该值的类型。对于整数值3,接口值的示意形式为(int, 3)
。
只有当内部值和类型都未设置时,接口值才为nil
,即(nil, nil)
。特别地,nil
接口将始终持有一个nil
类型。如果我们将类型为*int
的nil
指针存储在接口值中,无论指针的值如何,内部类型都将是*int
,即(*int, nil)
。因此,即使内部指针为nil
,这样的接口值仍然是非nil
的。
英文:
> Under the covers, interfaces are implemented as two elements, a type and a value. The value, called the interface's dynamic value, is an arbitrary concrete value and the type is that of the value. For the int
value 3, an interface value contains, schematically, (int, 3)
.
>
> An interface value is nil
only if the inner value and type are both unset, (nil, nil)
. In particular, a nil
interface will always hold a nil
type. If we store a nil
pointer of type *int
inside an interface value, the inner type will be *int
regardless of the value of the pointer: (*int, nil)
. Such an interface value will therefore be non-nil
even when the pointer inside is nil
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论