下面编译:
package main
import (
"fmt"
)
type User struct {
ID int64
}
func main() {
v := (*User)(nil)
fmt.Println(v)
}
这里,(*User)(nil)
是什么?我在go-pg上遇到了这个符号,没有找到答案的线索,因为在谷歌上很难搜索。
如果User
是一种类型,则*User
是另一种类型,指针类型,指向User
的指针。
(*User)(nil)
是一个类型转换:它将未类型化的nil
预先声明的标识符转换为(*User)
。必须将*User
放入括号中,否则表达式将尝试将nil
转换为User
(如果User
是结构体,则会导致编译时错误),然后对其解引用。
因此,v
将是*User
类型的变量,保存nil
指针的值。
v := (*User)(nil)
表达式是一个短的变量声明,它相当于(简写)以下变量声明:
var v *User = nil
和
是一样的var v *User
因为如果缺少初始化表达式,变量将被初始化为零值,对于所有指针类型都是nil
。