Go语言基础之指针

Go语言中的指针

Go语言中的函数传参都是值拷贝,当想修改某个变量时,就使用指针来操作。Go中的指针&(取地址),*(根据地址取值)

 

指针地址和类型

每个变量在运行时都有一个内存地址。Go中使用&变量名,对变量进行取地址操作。Go中的值类型(int、float、bool、string、array、struct),都有对应的指针类型如*int、*float、*bool、*string等。

func main() {
	a := 10
	b := &a
	*b = 100
	fmt.Println(a)            // 100
	fmt.Println(b, *b)        // 0xc0000100a0 100
}

 

指针取值

取值使用*操作

func main() {
	//指针取值
	a := 10
	b := &a // 取变量a的地址,将指针保存到b中
	fmt.Printf("type of b:%T\n", b)
	c := *b // 指针取值(根据指针去内存取值)
	fmt.Printf("type of c:%T\n", c)
	fmt.Printf("value of c:%v\n", c)
}

 

指针传值示例

func modify1(x int) {
	x = 100
}

func modify2(x *int) {
	*x = 100
}

func main() {
	a := 10
	modify1(a)
	fmt.Println(a) // 10
	modify2(&a)
	fmt.Println(a) // 100
}

 

new和make

经典示例

func main() {
	var a *int
	*a = 100
	fmt.Println(*a)

	var b map[string]int
	b["沙河娜扎"] = 100
	fmt.Println(b)
}

//  运行报错,因为都没有进行初始化,没有内存地址

 

new

func new(Type) *Type

// Type表示类型,new函数只接受一个参数,这个参数是一个类型
// *Type表示类型指针,new函数返回一个指向该类型内存地址的指针。

func main() {
	a := new(int)
	b := new(bool)
	fmt.Printf("%T\n", a) // *int
	fmt.Printf("%T\n", b) // *bool
	fmt.Println(*a)       // 0
	fmt.Println(*b)       // false
}

 

make

make也是用于分配内存空间,区别于new的是,他只能用于slice、map以及channel的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。make函数的函数签名如下:

func make(t Type, size ...IntegerType) Type

在使用slice、map和chan时候都必须先使用make进行初始化,然后才能对其进行操作。

func main() {
	var b map[string]int
	b = make(map[string]int, 10)
	b["沙河娜扎"] = 100
	fmt.Println(b)
}

 

new和make区别

1.二者都是做内存分配的

2.make只能用于slice、map和channel的初始化,返回还是这三个应用类型的本身

3.new用于类型的内存分配,并且内存对应的值为类型零值,返回指向类型的指针

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值