Go語言里面的指針和C++指針一樣,都是指向某塊內(nèi)存的地址值,可以解引用,不同只是在于C++里可以直接對(duì)指針做算術(shù)運(yùn)算而Go里面不行。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了太和免費(fèi)建站歡迎大家使用!
go語言中的指針和地址值,在使用上常常具有迷惑性,主要是其特殊的*、符號(hào)的使用,可能會(huì)讓你摸不透,本文希望能講清楚go語言的指針(pointer)和值(value)。
這里先簡(jiǎn)單的對(duì)指針和地址值概念做一個(gè)定義:
這是因?yàn)間o方法傳遞參數(shù)的方式導(dǎo)致的,go方法函數(shù)傳遞參數(shù)傳遞的是一個(gè)拷貝,看看下面的程序會(huì)輸出什么?
答案是8,而不是9,因?yàn)锳ddAge函數(shù)修改的是學(xué)生的一個(gè)備份,而不是原始的學(xué)生對(duì)象
如果你想正確的給學(xué)生年齡增加的話,函數(shù)傳遞的需要是這個(gè)值的指針,如下所示:
需要注意的是,這里我們的指針傳遞的仍然是一個(gè)拷貝,比如,如果你將s賦值給另外一個(gè)指針地址,不會(huì)影響原有的指針,這點(diǎn)可以自行實(shí)踐下。
那在使用go語言開發(fā)的時(shí)候,何時(shí)該用指針何時(shí)改用地址值呢?比如考慮以下場(chǎng)景:
簡(jiǎn)單原則: 當(dāng)你不確定該使用哪種的時(shí)候,優(yōu)先使用指針
如果考慮在數(shù)組、切片、map等復(fù)合對(duì)象中使用指針和值,比如:
很多開發(fā)者會(huì)認(rèn)為b會(huì)更高效,但是被傳遞的都是一個(gè)切片的拷貝,切片本身就是一個(gè)引用,所以這里被傳遞的其實(shí)沒有什么區(qū)別。
對(duì)于指針和地址值的使用,大家需要牢記的一點(diǎn)就是go數(shù)據(jù)傳遞的不可變性,活學(xué)活用此特點(diǎn),在無狀態(tài)函數(shù)中此特性非常有用。
于c語言相同,go中也有指針和結(jié)構(gòu)體的概念。指針表示變量的內(nèi)存地址,結(jié)構(gòu)體用來存儲(chǔ)同一類型的數(shù)據(jù)。
定義一個(gè)指針變量,將變量a的地址賦給指針變量p。這樣,指針變量p也就指向了變量a所在的內(nèi)容空間。
new 函數(shù)返回一個(gè)指針變量
fmt.scan() 就是傳入一個(gè)指針變量。
兩種方法都可以使用。
以上簡(jiǎn)要介紹了go語言中的指針和結(jié)構(gòu)體。
1.指針的作用
指針類型用于傳遞地址, 而不是傳遞值,這樣做的好處是避免值的體積過大, 影響傳遞的效率
2.指針的運(yùn)算符
1)*:*有兩個(gè)作用
①指針變量聲明:var a *string
②從指針變量中取值:
var b string="hello"
var c *string
c = b
fmt.Println(c)
fmt.Println(*c)
2):的作用是從變量中取址
var a int = 5
var b *int = a
fmt.Println(b)