gpt4 book ai didi

go - 使用指针和值接收器构造类型实例

转载 作者:IT王子 更新时间:2023-10-29 02:36:15 25 4
gpt4 key购买 nike

<分区>

让我们以这个非常小的例子为例,在结构中有一个修改值的函数:

package learn

type Point struct {
x int
y int
}

func (p *Point) Set(x int, y int) {
p.x = x
p.y = y
}

这可以正常工作,例如这样使用:

package main

import (
"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}

好吧,现在我们想防止在不调用构造函数的情况下创建点——这里并非如此,但对于复杂的类来说是有意义的——所以我们避免导出点,而是创建一个接口(interface),所以我重构了这样的代码: (这是行不通的!)

package learn

type 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 至关重要。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com