讓我們以這個非常小的例子為例,它有一個修改結(jié)構(gòu)內(nèi)部值的函數(shù):package learntype Point struct { x int y int}func (p *Point) Set(x int, y int) { p.x = x p.y = y}這工作正常,例如這樣使用:package mainimport ( "NewPattern/learn" "fmt")func main() { p := learn.Point{} p.Set(5, 6) fmt.Print(p)}它輸出預(yù)期值:{5,6}現(xiàn)在假設(shè)我不希望用戶擁有構(gòu)造函數(shù),我可以通過添加此函數(shù)來更改代碼:func NewPoint(x int, y int) Point { return Point{x, y}}然后我可以像這樣在 main 中使用:func main() { p := learn.NewPoint(3, 8) fmt.Print(p) p.Set(5, 6) fmt.Print(p)}并且它按預(yù)期返回{3 8}{5 6}。好吧,現(xiàn)在我們想防止在不調(diào)用構(gòu)造函數(shù)的情況下創(chuàng)建點——這里并非如此,但對于復(fù)雜的類來說是有意義的——所以我們避免導(dǎo)出點,而是創(chuàng)建一個接口,所以我重構(gòu)了這樣的代碼:(這是不工作?。﹑ackage learntype point struct { x int y int}type Point interface { Set(x int, y int)}func (p *point) Set(x int, y int) { p.x = x p.y = y}func NewPoint(x int, y int) Point { return point{x, y} //error here}這說:cannot use point literal (type point) as type Point in return argument: point does not implement Point (Set method has pointer receiver)我可以通過修改以下方法來“修復(fù)”這個問題:func NewPoint(x int, y int) point { return point{x, y}}但這只是移動了 main 中的錯誤,重構(gòu)為:func main() { var p learn.Point p = learn.NewPoint(3, 8) //error here! fmt.Print(p) p.Set(5, 6) fmt.Print(p)}錯誤是:cannot use learn.NewPoint(3, 8) (type learn.point) as type learn.Point in assignment: learn.point does not implement learn.Point (Set method has pointer receiver)通過谷歌搜索我設(shè)法以這種方式解決:func NewPoint(x int, y int) *point { return &point{x, y}}但作為主要結(jié)果,我們獲得了:&{3 8}&{5 6} 作為印刷品,我也不知道幕后發(fā)生了什么。我想這在某種程度上與事物傳遞有關(guān),并且可能按價值“返回”,是這種情況嗎?但我不知道第一個沒有界面的例子是如何毫不費力地工作的。可以請某人澄清這些細節(jié),我認為這些細節(jié)對于理解 Go 是必不可少的。
1 回答

守著星空守著你
TA貢獻1799條經(jīng)驗 獲得超8個贊
point
和*point
(即指向點的指針)是兩種不同的類型。在您的代碼中,接口Point
是按*point
類型實現(xiàn)的。您可以將構(gòu)造函數(shù)實現(xiàn)為:
func NewPoint(x int, y int) Point { return &point{x, y} }
打印將顯示&
在點值之前,因為基礎(chǔ)值是一個指針。
- 1 回答
- 0 關(guān)注
- 119 瀏覽
添加回答
舉報
0/150
提交
取消