Golang亿点小细节之(var := new make)

@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
	*/
}

var初始化,赋值零值,零值不一定是0哦!
var可以在任何地方定义变量,:=只能在函数内使用
tip
:=进行多值声明并赋值的时候,其左边如果未出现了新声明的变量,则会报错,如果有的话,其他已经声明过的变量只会重新赋值,这个规则要注意变量的作用域。

new()和make()

new()make()都是用来创建对象的
make() 的作用是初始化内置的数据结构,也就是我们在前面提到的slice,map ,chan
new() 的作用是根据传入的类型分配一片内存空间并返回指向这片内存空间的指针
事实上他们返回的都是引用类型
引用类型就是变量直接存放的就是一个地址值,这个地址值指向的空间存的才是值,比如指针。
go中的引用类型还有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
	//  可见两者等价
}

猜你喜欢

转载自blog.csdn.net/qq_17818281/article/details/114987050