tips: *號(hào),可以指向指針類型內(nèi)存地址上的值,號(hào),可以獲取值類型的內(nèi)存地址
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了福州免費(fèi)建站歡迎大家使用!
每一個(gè)變量都有內(nèi)存地址,可以通過(guò)變量來(lái)操作內(nèi)存地址中的值,即內(nèi)存的大小
go語(yǔ)言中獲取變量的內(nèi)存地址方法:通過(guò) 符號(hào)可以獲取變量的地址
定義:普通變量存儲(chǔ)的是對(duì)應(yīng)類型的值,這些類型就叫值類型
變量b,在內(nèi)存中的地址為:0x1040a124,在這個(gè)內(nèi)存地址上存儲(chǔ)的值為:156
定義:指針類型的變量存儲(chǔ)的是?個(gè)地址,所以?叫指針類型或引?類型
b 是值類型,它指向的是內(nèi)存地址上的值
a是指針類型,它指向的是b的內(nèi)存地址
指針類型定義,語(yǔ)法: var 變量名 *類型
指針類型在定義完成后,默認(rèn)為空地址,即空指針(nil)
在定義好指針變量后,可以通過(guò)***** 符號(hào)可以獲取指針變量指向的變量
在這里的 *a 等價(jià)于 b,通過(guò)修改 *a ,最終修改的是值類型b的值
這里a,d是值類型,b,c是指針類型
d就相當(dāng)于把a(bǔ)內(nèi)存地址上值,在內(nèi)存中從新開(kāi)辟了一塊空間存儲(chǔ),d和a互不影響
b,c相當(dāng)于指向了a的內(nèi)存地址,當(dāng)使用*號(hào)引用出內(nèi)存地址上的變量上,修改值得,a的值也會(huì)跟著改變
go語(yǔ)言中的指針和地址值,在使用上常常具有迷惑性,主要是其特殊的*、符號(hào)的使用,可能會(huì)讓你摸不透,本文希望能講清楚go語(yǔ)言的指針(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語(yǔ)言開(kāi)發(fā)的時(shí)候,何時(shí)該用指針何時(shí)改用地址值呢?比如考慮以下場(chǎng)景:
簡(jiǎn)單原則: 當(dāng)你不確定該使用哪種的時(shí)候,優(yōu)先使用指針
如果考慮在數(shù)組、切片、map等復(fù)合對(duì)象中使用指針和值,比如:
很多開(kāi)發(fā)者會(huì)認(rèn)為b會(huì)更高效,但是被傳遞的都是一個(gè)切片的拷貝,切片本身就是一個(gè)引用,所以這里被傳遞的其實(shí)沒(méi)有什么區(qū)別。
對(duì)于指針和地址值的使用,大家需要牢記的一點(diǎn)就是go數(shù)據(jù)傳遞的不可變性,活學(xué)活用此特點(diǎn),在無(wú)狀態(tài)函數(shù)中此特性非常有用。
1、反射可以在運(yùn)行時(shí) 動(dòng)態(tài)獲取變量的各種信息 ,比如變量的類型、類別;
2、如果是結(jié)構(gòu)體變量,還可以獲取到結(jié)構(gòu)體本身的信息(包括結(jié)構(gòu)體的字段、方法);
3、通過(guò)反射,可以修改 變量的值 ,可以調(diào)用關(guān)聯(lián)的方法;
4、使用反射,需要import " reflect ".
5、示意圖:
1、不知道接口調(diào)用哪個(gè)函數(shù),根據(jù)傳入?yún)?shù)在運(yùn)行時(shí)確定調(diào)用的具體接口,這種需要對(duì)函數(shù)或方法反射。
例如以下這種橋接模式:
示例第一個(gè)參數(shù)funcPtr以接口的形式傳入函數(shù)指針,函數(shù)參數(shù)args以可變參數(shù)的形式傳入,bridge函數(shù)中可以用反射來(lái)動(dòng)態(tài)執(zhí)行funcPtr函數(shù)。
1、reflect.TypeOf(變量名),獲取變量的類型,返回reflect.Type類型。
2、reflect.ValueOf(變量名),獲取變量的值,返回reflect.Value類型reflect.Value是一個(gè)結(jié)構(gòu)體類型。
3、變量、interface{}和reflect.Value是可以互相轉(zhuǎn)換的,這點(diǎn)在實(shí)際開(kāi)發(fā)中,會(huì)經(jīng)常使用到。
1、reflect.Value.Kind,獲取變量的 類別(Kind) ,返回的是一個(gè) 常量 。在go語(yǔ)言文檔中:
示例如下所示:
輸出如下:
Kind的范疇要比Type大。比如有Student和Consumer兩個(gè)結(jié)構(gòu)體,他們的 Type 分別是 Student 和 Consumer ,但是它們的 Kind 都是 struct 。
2、Type是類型,Kind是類別,Type和Kind可能是相同的,也可能是不同的。
3、通過(guò)反射可以在讓 變量 在 interface{} 和 Reflect.Value 之間相互轉(zhuǎn)換,這點(diǎn)在前面畫過(guò)示意圖。
4、使用反射的方式來(lái)獲取變量的值(并返回對(duì)應(yīng)的類型),要求數(shù)據(jù)類型匹配,比如x是int,那么久應(yīng)該使用reflect.Value(x).Int(),而不能使用其它的,否則報(bào)panic。
如果是x是float類型的話,也是要用reflect.Value(x).Float()。但是如果是struct類型的話,由于type并不確定,所以沒(méi)有相應(yīng)的方法,只能 斷言。
5、通過(guò)反射的來(lái)修改變量,注意當(dāng)使用SetXxx方法來(lái)設(shè)置需要通過(guò)對(duì)應(yīng)的指針類型來(lái)完成,這樣才能改變傳入的變量的值,同時(shí)需要使用到reflect.Value.Elem()方法。
輸出num=20,即成功使用反射來(lái)修改傳進(jìn)來(lái)變量的值。
6、reflect.Value.Elem()應(yīng)該如何理解?
網(wǎng)頁(yè)名稱:go語(yǔ)言斷言指針類型 go指針的指針
文章來(lái)源:http://m.rwnh.cn/article42/doohiec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、App開(kāi)發(fā)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容