表达式 new(T)将创建一个 T 类型的匿名变量,初始化一个零值,且返回一个指针*T。
ptr := new(int) // p, *int 类型, 指向匿名的 int 变量 fmt.Println(*ptr) // 0 fmt.Println(ptr) // 0xc0000180c8 *ptr = 2 // 设置 int 匿名变量的值为 2 fmt.Println(*ptr) // 2 fmt.Println(ptr) // 0xc0000180c8 a := 5 fmt.Println("地址:", &a)
new 是一个预定义函数,可被重定义。 用 new 创建变量和普通变量声明语句方式创建变量没有什么区别,所以这个是很少用的。 每次调用 new 函数都是返回一个新的变量的地址,对应的变量叫指针。
p1 := new(int) p2 := new(int) fmt.Println("p1地址:", p1, "p2地址:", p2) // p1地址: 0xc000018110 p2地址: 0xc000018118 fmt.Println("p1值:", *p1, "p2值:", *p2) // p1值: 0xc000018110 p2值: 0xc000018118 fmt.Println(p1 == p2) // false
此种情况多数 p1 和 p2 两个指针的是不同的。
如果两个类型都是空的,也就是说类型的大小是 0,例如 struct{}和[0]int, 有可能有相同的地址(依赖具体的语言实现)(应该谨慎使用大小为 0 的 类型,因为如果类型的大小为 0 的话,可能导致 Go 语言的自动垃圾回收器有 不同的行为,具体请查看 runtime.SetFinalizer 函数相关文档)