@Golang亿点小细节之(var := new make)
你所忽略的,往往才是Bug的起源
var和:=
package main
import "fmt"
var a int
/* var可以在任何地方定义变量,:=只能在函数内使用
a:=1
expected declaration
*/
func main() {
var b int
// var初始化,赋值零值,零值不一定是0哦!
c := 1
fmt.Println("c addr=",&c)
/* 左侧没有新变量 报错了
b,c := 2,5
no new variables on left side of :=
*/
//左侧有新变量d,c重赋值
d, c := 2, 5
// 通过对比地址可以发现,只是赋值而已
fmt.Println("d addr=",&d,"-","c addr=",&c)
if true {
// 此处可见,声明了同名变量b和c
b,c := 2,5
fmt.Println("b addr=",&b,"-","c addr=",&c)
e, d := 7,8
fmt.Println(b,"-",c,"-",e,"-",d)
fmt.Println("d addr=",&d)
}
fmt.Println(a,"-",b,"-",c,"-",d)
/*
output:
c addr= 0xc000012088
d addr= 0xc0000120a8 - c addr= 0xc000012088
b addr= 0xc0000120c0 - c addr= 0xc0000120c8
2 - 5 - 7 - 8
d addr= 0xc0000120d0
0 - 0 - 5 - 2
*/
}
varvar:=:=
new()和make()
new()make()make()slice,map ,channew()slice,map ,chan ,interface
import "fmt"
func main() {
var a *int
b :=1
a = &b
fmt.Println(a)
/* 引用类型是无法取地址的
fmt.Println(&a)
*/
}
make()
type T struct{
}
func newT() *T{
return &T{}
}
make()newT()
var和new
func main() {
var t *T
t =&T{}
t1:= new(T)
fmt.Println(reflect.TypeOf(t)==reflect.TypeOf(t1))
// output:
// true
// 可见两者等价
}