Go基础学习-指针地址、指针类型;new、make

本文深入探讨了Go语言中的指针概念,包括如何使用&和*符号进行取址和取值,展示了指针在修改变量值的应用场景。同时,文章对比了值类型和引用类型的内存申请方式,解释了new和make函数的用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针

Go语言中的指针不能进行偏移和运算,是安全指针;只需要记住两个符号:&(取地址)和*(根据地址取值)。

指针地址

通过&;放在变量前进行取地址的操作,得到的就是指针地址

指针类型

通过&取到地址的变量就是指针类型,go语言中的值类型(int、float、bool、string、array、struct)都有指针类型(*int、*float等)

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
指针取值

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

a := 10
b := &a
c:=*b
fmt.Println(c)//10
//示例;&与*是的一对互补的符号
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
}

GO语言中值类型和引用类型的内存的申请(new、make)

  • 值类型的内存申请:在变量声明时就自动申请了内存;也可以通过new()来申请,返回的是对应类型的指针;
  • 引用类型的内存申请:引用类型在申明后并不会分配内存,需要手动申请内存;可通过make来也可以声明后直接实例化来申请内存;go中的引用类型有slice、map、channel(make只作用于这三种,且返回的是他们本生类型);此外指针本生也是引用类型
//new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值
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

var a *int
a = new(int) //指针本生也是引用类型,不new申请的话会panic
*a = 10
fmt.Println(*a
var a int
fmt.Println(&a)//0xc00000a0c8

var b map[string]int
b=make(map[string]int,0)  //make申请内存
b["zs"] = 100
fmt.Println(b) //没有make会panic

b:= map[string]int{"zs":12}
fmt.Println(b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值