Go值接收者方法和指標接收者方法

2021-10-01 12:51:39 字數 1820 閱讀 2497

go語言有值型別和指標型別直接呼叫其值接收者方法和指標接收者方法的區別:

先看乙個例項:

package main

import "fmt"

type ifather inte***ce

type person struct

func(p person) getname() string

func(p *person) setname(name string)

func main()

fmt.printf("未初始化預設值:per :%s\n",per.getname())

per.setname("test")

fmt.printf("設定值後:per :%s\n",per.getname())

per2 := &person

fmt.printf("初始化值後:per2 :%s\n",per2.getname())

per2.setname("wanger")

fmt.printf("設定值後:per2 :%s\n",per2.getname())

}

輸出:

未初始化預設值:per1 :

設定值後:per1 :test

初始化值後:per2 :lisi

設定值後:per2 :wanger

值型別變數和指標型別變數都可以呼叫其值接收者方法和指標接收者方法。

值接收者宣告的方法,呼叫時會使用這個值的乙個副本去執行,而指標接收者在呼叫時會共享呼叫方法時接收者所指向的值,即可以修改指向的值。

值接收者和指標接收者賦值給介面的區別:

還是上面乙個例項,稍微更改一下:就把物件賦給介面

package main

import "fmt"

type ifather inte***ce

type person struct

func(p person) getname() string

func(p *person) setname(name string)

func main()

var iper2 ifather = person

fmt.printf("未初始化預設值:s1:%s\n",iper.getname())

iper.setname("test")

fmt.printf("設定值後:s1:%s\n",iper.getname())

}

編譯將報錯:出現在這行

var iper2 ifather = person
person沒有實現介面ifather的setname函式,所以不能賦值。

表面上看*person也沒有實現getname函式,但是*person所指向的值實現了getname函式,所以*person也自動擁有getname函式,所以實現介面ifather。person作為值接收者,go無從知道值的原始值是什麼,因為 值接收者 是份拷貝,所以不能影響person。go 會把指標進行隱式轉換得到 value,但反過來則不行。

所以,型別 t 變數只有接受者是 t 的方法;而型別 *t變數擁有接受者是 t 和 *t 的方法,換句話,當實現了乙個接收者是值型別的方法,就可以自動生成乙個接收者是對應指標型別的方法,因為兩者都不會影響接收者。但是,當實現了乙個接收者是指標型別的方法,如果此時自動生成乙個接收者是值型別的方法,原本期望對接收者的改變(通過指標實現),現在無法實現,因為值型別會產生乙個拷貝,不會真正影響呼叫者。

(1)指標型別變數*t可以接收t和*t方法

(2)型別t只能接收t方法

值接收者和指標接收者

go語言中有兩種型別的接收者 值型別的接收者和引用型別的接收者 如果使用值接收者宣告方法,呼叫時會使用這個值的乙個副本來執行。當呼叫使用指標接受者宣告的方法時,這個方法會共享呼叫方法時接收者所指向的值。內建型別 值傳遞 數值型別,字串型別,布林型別 引用型別 應用傳遞 切片,對映,通道,介面,函式型...

Go 值接收者和指標接收者 區別

首先回顧一下go語言值型別和指標型別直接呼叫其值接收者方法和指標接收者方法的區別 先看乙個例項 package main import fmt type i inte ce type s struct func s s get int func s s set age int func main f...

Go介面中的值接收者和指標接收者

先說結論 在實現介面時,應保持接收者定義 結構體定義 斷言型別一致 當方法的接收者定義為值型別時,go 語言編譯器會自動做轉換,所以值型別接收者和指標型別接收者是等價的,編譯不會報錯,執行也都可以呼叫相應方法。package main import fmt type a inte ce type b...