为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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}。好吧,现在我们想防止在不调用构造函数的情况下创建点——这里并非如此,但对于复杂的类来说是有意义的——所以我们避免导出点,而是创建一个接口,所以我重构了这样的代码:(这是不工作!)package 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 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信