Go--指針

Go語言中的指針

任何程序數據都需要載入內存中,那麼在內存中都會有一個內存地址,這其實就是指針。爲了保存一個數據在內存中的地址,我們就需要用到指針變量

Go語言中的指針不能進行偏移和運算,因此Go語言中的指針操作其實也非常簡單,&(取地址)和*(根據內存地址取值)

 

指針地址和指針類型

每個變量在運行的時候都擁有一個地址,這個地址代表變量在內存中的地址。Go語言中利用&字符放在變量的前面對變量進行操作       

ptr := &v    // v的類型爲T   
  • v:代表被取地址的變量,類型爲T
  • ptr:用於接收內存地址的變量,ptr的類型爲*T,叫做T的指針類型。*代表指針

 

 

指針取值

對於普通變量使用&操作符取內存地址以後就會獲得這個變量的指針,然後可以對指針使用*操作,也就是利用指針取值

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

  

總結:取地址操作符&和取值操作符*是一對互補的操作符,&取出內存地址,*根據內存地址取出地址指向的值,然後再進行後續的操作

 

 變量、指針地址、指針變量、取地址、取值的相互的關係:

  • 對變量進行取地址&操作,可以獲取這個變量的指針地址
  • 指針變量的值是指針地址
  • 對指針變量進行取值*操作,就可以獲取指針變量指向的變量的值
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 new(Type) *Type
  • type表示類型,new函數只接受一個參數,這個參數就是一個類型
  • *type表示指針類型,new函數返回一個指向該類型內存地址的指針

new函數不太常用,使用new函數得到的是一個類型的指針,並且該指針對應的值爲該類型的零值

 

之前的代碼中,var a *int  只是聲明瞭一個指針變量a但是沒有初始化成功,指針作爲引用類型需要初始化後纔會擁有內存空間,纔可以給它做賦值操作

func main() {
	var a *int
	a = new(int)
	*a = 10
	fmt.Println(*a)
}

 

 

make

make也是用於內存分配的,區別於new,它適用於slice、map以及chan類型的創建,而且它的返回類型就是這三個類型本身,而不是他們的指針類型,因爲這三種類型就是引用類型,所以也就沒有必要返回他們的指針了。

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

make函數是無可替代的,我們在使用slice、map以及channel的時候,都需要使用make進行初始化,然後纔可以對它們進行操作。

如map中要是隻聲明變量是一個map類型,是不能進行操作的,必須利用make先對map進行初始化操作之後能可以對鍵值對進行賦值。

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

  

make和new的區別:

  • 二者都是用來做內存分配的
  • make只用於slice、map、channel的初始化,返回的還是這三個引用類型的本身
  • new用於類型的內存分配,並且內存對應的值爲類型的零值,返回的是指向類型的指針

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章