一旦回傳型別是一個介面,宣告地址(&)或不宣告地址有什么區別?
func NewService(repository. Repository) Service {
//或不含"&"。
return &myService{
資源庫: rep
}
}
uj5u.com熱心網友回復:
區別在于,如果實作介面所需的方法有一個指標接收器,你必須回傳一個指標。 如果該方法有一個值接收器,你可以使用其中之一。 例如:
https://play.golang.org/p/ToGKyIjIJNQ
package main
import (
"fmt"/span>
)
type Hello interface {
Hello() string
}
type World interface {
World() string }
}
type HelloWorlder interface {
Hello() string
World() string string
}
type test struct{}。
func (t *test) Hello() string{
return "Hello"
}
func (t test) World() string {
return "World"
}
func HelloWorld1() HelloWorlder {
return &test{}。
}
//如果你不加注釋,它將不會被編譯。
/func HelloWorld2() HelloWorlder {.
// return test{}
//}
func main() {
greeter1 := HelloWorld1()
//greeter2 := HelloWorld2()/span>
fmt.Println(greeter1.Hello(), greeter1.World())
//fmt.Println(greeter2.Hello(), greeter2.World())
}
uj5u.com熱心網友回復:
這個問題可以歸結為介面的可分配性。
https://golang.org/ref/spec#Assignability
https://golang.org/ref/spec#Interface_types一個值x是可以分配給一個T型別的變數的("x是可以分配給 T"),如果下列條件之一適用:......
- T是一個介面型別,并且x實作了T。
一個介面型別指定了一個稱為其介面的方法集。
https://golang.org/ref/spec#Method_sets
一個型別T的方法集包括所有以 接收器型別T的所有方法。相應的指標型別*T的方法集 的方法集是用接收器*T或T宣告的所有方法的集合(也就是說,它也包含T的方法集)。 也包含了T的方法集)
一個型別的方法集決定了該型別所實作的介面以及可以使用該型別的接收器呼叫的方法。
一旦回傳型別是一個介面,宣告地址(&)與否有什么區別?
一個構建錯誤。
《有效圍棋》中有一章是關于指標和值接收器之間的區別的。
https://golang.org/doc/effective_go#methods
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313754.html
標籤:
