go 指针

go 指针

基本概念

指针类型:Go 中的指针由 * 符号表示。例如,*int 表示一个指向整数的指针。

获取地址:使用 & 符号可以获取变量的地址,例如 &x 表示变量 x 的地址。

解引用:通过 * 符号可以获取指针指向的值,例如 *ptr 可以获取 ptr 指向的值。

零值指针:指针的零值为 nil,在使用指针之前应确保它不为 nil。

指针与性能:虽然使用指针可以提高性能,但过度使用指针可能会导致代码难以理解和维护。

Go语言中使用&字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string等。

ptr := &v    // v的类型为T
- v:代表被取地址的变量,类型为`T`
- ptr:用于接收地址的变量,ptr的类型就为`T`,称做T的指针类型。*代表指针。
func main() {
	a := 10
	b := &a
	fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078
	fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int
	fmt.Println(&b)                    // 0xc00000e018
}

指针取值

在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用*操作,也就是指针取值,代码如下。

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)
}
type of b:*int
type of c:int
value of c:10

new和make

func new(Type) *Type

func make(Type, size int) Type

new函数用于分配内存,返回指向新分配的Type类型的指针。

make函数用于根据指定的Type类型和大小分配内存,并返回Type类型的值。

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
}

func main() {
	var a *int// 声明一个指针
	a = new(int) // 指针初始化
	*a = 10
	fmt.Println(*a)
}

make也是用于内存分配的,区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,

因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。

func main() {
	var b map[string]int         //``声明一个map
	b = make(map[string]int, 10) // 初始化map 并设置初始容量为10
	b["one"] = 1
	b["two"] = 2
	b["three"] = 3

	fmt.Println(b)
}


new与make的区别

  1. 二者都是用来做内存分配的。
  2. make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
  3. 而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值