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

指针

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)

猜你喜欢

转载自blog.csdn.net/wzb_wzt/article/details/107381696