指標型別比較常見
type dog structfunc (dog *dog) setname (name string
)
對於基本型別dog來說,*dog就是它的指標型別。&dog就是d值不為nil的dog變數的指標值。如果乙個方法的接收者是*dog型別,那麼該方法就是基本型別dog的乙個指標方法,在這種情況下,方法接收者實際上就是當前基本值的指標值,可以他通過指標值訪問到基本值包含的任何字段以及呼叫與之關聯的任何方法。
傳統意義上來說,指標式指向某個確切的記憶體位址的值。go語言中還有其他幾樣東西可以代表指標,其中最貼近傳統意義的是uintptr型別。unsafe.pointer可以表示任何指向可定址的值的指標。同時也是前面提到的指標值和uintptr值之間的橋梁,通過它可以在這兩種值之上進行雙向的轉換
1)不可變的值會被儲存到乙個確切的記憶體區域
如:常量、基本型別字面量、字串值、基於字串的索引或切片的結果值
2)臨時結果,可以把各種對值字面量施加的表示式的求值結果都看作是臨時結果
如:算術操作的結果值,針對值字面量的表示式的結果值、型別轉換表示式結果值,型別斷言表示式結果值、對函式或方法的呼叫結果值
有一例外:對切片字面量的索引結果值可定址
如果把臨時結果賦給乙個變數,那麼它就是可定址的了。
3)不安全的,破壞程式一致性
2、不可定址的值在使用上有哪些限制?
首先是無法使用取址操作符&獲取它們的指標
func new (name string) dog
}new(
"little pig
").setname("
monster
")
上面的**可以執行成功嗎?
對乙個dog型別的變數dog來說,呼叫表示式dog.setname("monster")會被自動轉譯為(&dog).setname("monster"),即:先取dog的指標值,再在該指標值上呼叫setname方法。但是new函式所得的結果值屬於臨時結果,是不可定址的,因此會報錯。
go語言中++或--的左邊表示式的結果值必須是可定址的。
Go指標操作
package main import fmt go提供了控制資料結構指標的能力,但不能進行指標運算 go允許控制特定集合的資料結構,分配的數量以及記憶體訪問模式 指標 型別指標,允許對這個指標型別的資料進行修改,傳遞資料可以直接使用指標。而無需拷貝資料,類指標不能進行偏移和運算 切片,由指向起始元...
Go 語言指標
b 什麼是指標 b 乙個指標變數指向了乙個值的記憶體位址。類似於變數和常量,在使用指標前你需要宣告指標。指標宣告格式如下 var var name var type var type 為指標型別,var name 為指標變數名,號用於指定變數是作為乙個指標。以下是有效的指標宣告 var ip int...
GO語言指標
以前學習的語言裡沒有指標操作,剛接觸到go語言指標,消化的比較慢,故寫一下。指標型別宣告 t,指標的型別為 t,例 var i int 指標型別的值 t 在等號左邊表示指標宣告var a int 32 p a p的值是指向a的位址在指標前加 獲取指標p指向的值,例 var a int 32 變數宣告...