亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用指針和值接收器構造類型的實例

使用指針和值接收器構造類型的實例

Go
眼眸繁星 2023-04-17 16:34:26
讓我們以這個非常小的例子為例,它有一個修改結構內部值的函數: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)}它輸出預期值:{5,6}現在假設我不希望用戶擁有構造函數,我可以通過添加此函數來更改代碼: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)}并且它按預期返回{3 8}{5 6}。好吧,現在我們想防止在不調用構造函數的情況下創建點——這里并非如此,但對于復雜的類來說是有意義的——所以我們避免導出點,而是創建一個接口,所以我重構了這樣的代碼:(這是不工作?。﹑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)我可以通過修改以下方法來“修復”這個問題:func NewPoint(x int, y int) point {    return point{x, y}}但這只是移動了 main 中的錯誤,重構為: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)通過谷歌搜索我設法以這種方式解決:func NewPoint(x int, y int) *point {    return &point{x, y}}但作為主要結果,我們獲得了:&{3 8}&{5 6} 作為印刷品,我也不知道幕后發生了什么。我想這在某種程度上與事物傳遞有關,并且可能按價值“返回”,是這種情況嗎?但我不知道第一個沒有界面的例子是如何毫不費力地工作的。可以請某人澄清這些細節,我認為這些細節對于理解 Go 是必不可少的。
查看完整描述

1 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

point*point(即指向點的指針)是兩種不同的類型。在您的代碼中,接口Point是按*point類型實現的。您可以將構造函數實現為:

func NewPoint(x int, y int) Point { 
   return &point{x, y} 
}

打印將顯示&在點值之前,因為基礎值是一個指針。


查看完整回答
反對 回復 2023-04-17
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號