先說結論:在實現介面時,應保持接收者定義、結構體定義、斷言型別一致
當方法的接收者定義為值型別時, go 語言編譯器會自動做轉換,所以值型別接收者和指標型別接收者是等價的,編譯不會報錯,執行也都可以呼叫相應方法。
package main
import "fmt"
type a inte***ce
type b struct
func (b b) echo()
func main()
a.echo()
b := &b
b.echo()
}
[why@whydemacbook-pro] ~/desktop/go/test$go run main.go bb
[why@whydemacbook-pro] ~/desktop/go/test$
當接收者型別為指標時,定義或斷言型別任意乙個為值時,在編譯時就會報錯,提示 echo 方法應該是指標型別接收者:
package main
import "fmt"
type a inte***ce
type b struct
func (b *b) echo()
func main()
tmp.echo()
c := tmp.(b)
fmt.println(c)
}
[why@whydemacbook-pro] ~/desktop/go/test$go run main.go
# command-line-arguments
./main.go:20:6: cannot use b literal (type b) as type a in assignment:
b does not implement a (echo method has pointer receiver)
./main.go:24:10: impossible type assertion:
b does not implement a (echo method has pointer receiver)
[why@whydemacbook-pro] ~/desktop/go/test$
當接收者型別為值,定義結構體時也為值,斷言型別為指標時,編譯不會出問題,但是執行會拋異常:
package main
import "fmt"
type a inte***ce
type b struct
func (b b) echo()
func main()
tmp.echo()
c := tmp.(*b)
fmt.println(c)
}
[why@whydemacbook-pro] ~/desktop/go/test$go build
[why@whydemacbook-pro] ~/desktop/go/test$ll
total 4152
-rw-r--r-- 1 why staff 300 nov 30 21:51 main.go
-rwxr-xr-x 1 why staff 2120448 nov 30 21:51 test
[why@whydemacbook-pro] ~/desktop/go/test$./test
bpanic: inte***ce conversion: main.a is main.b, not *main.b
goroutine 1 [running]:
main.main()
/users/why/desktop/go/test/main.go:24 +0x79
[why@whydemacbook-pro] ~/desktop/go/test$
為了避免以上問題,我們可以在介面型別斷言時,通過第二個引數(bool型別),去判斷斷言是否成功:
package main
import "fmt"
type a inte***ce
type b struct
func (b b) echo()
func main()
tmp.echo()
c, err := tmp.(*b)
if err == false
fmt.println(c)
}
現象:
規範:
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值接收者方法和指標接收者方法
go語言有值型別和指標型別直接呼叫其值接收者方法和指標接收者方法的區別 先看乙個例項 package main import fmt type ifather inte ce type person struct func p person getname string func p person ...