@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
	//  可见两者等价
}