golang基础 --- 指针
golang 基础 — 指针
Go语言的指针是安全指针(不能进行偏移和运算):指针的地址 指针类型 指针取值
Go语言中函数传参都是值拷贝,我们想要在函数中修改这个变量,我们可以创建一个指向该变量的指针,函数传参时传递指向这个变量的指针从而实现对变量的修改。
&: 取地址符号 * :根据地址取值
1.&取地址
go语言中的值类型:int float bool string array struct
值类型都有其对应的指针类型 *int *string *struct…
ptr := &v //对变量v取地址 将变量v的地址存入ptr变量中
v :代表取地址的变量 类型T
ptr : 用于接收地址的变量 类型为*T
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oIlqLrQp-1632478278623)(C:\Users\chenjunde\AppData\Roaming\Typora\typora-user-images\image-20210924172055468.png)]
func main(){
a := 10 //定义a变量
b := &a //定义b变量
fmt.Printf("a:%d ptr:%p\n",a,&a) // a:10 ptr:0xc00001a078
fmt.Printf("b:%d type:%T\n",b,b) // b:0xc00001a078 type:*int
fmt.Printf("Ptrb:",&b) // 0xc00000e018
}
2.指针取值 *
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("type of c:%v\n",c)
}
总结:
1.对变量进行取地址&操作 可以获得这个指针变量
2.指针变量的值是指针地址
3.对指针变量进行取值*操作 可以获得指针变量指向的原变量值
案例:演示函数参数是值传递
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
}
3.nil空指针
当一个指针变量没有被赋予任何值时 指针变量的值为nil(空指针)
func main(){
var p *string
fmt.Println(p)
fmt.Printf("p的值为%v",p)
if p != nil {
fmt.Println("非空")
} else {
fmt.Println("空值")
}
}
4.new 和 make
对于值类型的变量,定义变量就为其分配了内存空间,而对于引用类型来讲,不仅仅要声明它,而且还需要为其分配内存空间,否则无法进行存储.
new函数:
func new(Type) *Type
1.new函数接收一个参数 这个参数是一个类型
2.*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函数只对特定的应用类型进行内存分配:slice map chan,返回值就是类型本身
func make(t Type.size ...intergerType)
make函数是一个经常使用的函数:我们在使用slice map chan 时都必须使用make函数进行初始化后才能进行使用
func main() {
var b map[string]int //定义了一个map[string]int 并没有对其进行初始化
v = make(map[string]int,10) //初始化map[string]int 并分配10个空间
b["测试"] = 100 //初始化后开辟内存空间 可以对map进行操作
fmt.Println(b)
}
make & new
make 和 new的区别
1. 两者都是用来分配内存的
2.make只能为特定的类型进行内存分配 slice map chan 返回的时引用类型本身
3.new用于类型的内存分配 并且内存对应的值为类型的零值 返回的是指向类型的指针