Pointers 如何在围棋中使用接收器?

Pointers 如何在围棋中使用接收器?,pointers,go,struct,receiver,Pointers,Go,Struct,Receiver,下面是两个代码示例 示例1: package main import "fmt" type Dat struct { Num int } func (d *Dat) Fn1a(i int) { d.Num = i } func (d *Dat) Fn2a() { d.Num++ } func main() { var d Dat d.Fn1a(1) d.Fn2a() fmt.Println(d) } package main

下面是两个代码示例

示例1:

package main

import "fmt"

type Dat struct {
    Num int
}

func (d *Dat) Fn1a(i int) {
    d.Num = i
}

func (d *Dat) Fn2a() {
    d.Num++
}

func main() {
    var d Dat
    d.Fn1a(1)
    d.Fn2a()
    fmt.Println(d)
}
package main

import "fmt"

type Dat struct {
    Num int
}

func Fn1b(i int) *Dat {
    d := &Dat{i}
    return d
}

func (d *Dat) Fn2b() *Dat {
    d.Num++
    return d
}

func main() {
    d := Fn1b(1).Fn2b()
    fmt.Println(d)
}
示例2:

package main

import "fmt"

type Dat struct {
    Num int
}

func (d *Dat) Fn1a(i int) {
    d.Num = i
}

func (d *Dat) Fn2a() {
    d.Num++
}

func main() {
    var d Dat
    d.Fn1a(1)
    d.Fn2a()
    fmt.Println(d)
}
package main

import "fmt"

type Dat struct {
    Num int
}

func Fn1b(i int) *Dat {
    d := &Dat{i}
    return d
}

func (d *Dat) Fn2b() *Dat {
    d.Num++
    return d
}

func main() {
    d := Fn1b(1).Fn2b()
    fmt.Println(d)
}
两个样本输出相同的结果

我的问题是关于这些样品之间的区别。我可以注意到以下区别


虽然在示例1中,
type Dat struct
可以更改为
type Dat struct
,但在示例2中,当
type Dat struct
更改为
type Dat struct
时,golint显示一条警告:
导出的func Fn1b返回未报告的type*main.Dat,这可能会让人讨厌使用
。因此,在示例1中,
dat
可以直接用作
struct
,而无需公开

还有其他区别吗?例如,哪个更好


非常感谢您的时间和建议。很抱歉我的问题不成熟。

你的问题中有一些不同的主题:

1)导出和未导出的类型

如果您有一个导出的函数,并且该函数返回一个未导出的类型,那么当您在包外部调用该函数时,将导致错误

因此,假设不允许将您的类型
Dat
未报告

2)哪种解决方案更好?

这取决于,但它将是样本2。你可以看到你的主要功能有多干净。如果你的结构更复杂,你可以在那里做一些事情。例如,您的结构有一个参数,它是一个映射,您需要使用
make()
初始化该映射。在示例1中,每次创建新的Dat类型时都需要这样做


通常您会调用该函数
NewDat()
。如果在创建新的Dat变量时始终使用该函数,则代码的更改也会更加灵活。

“当
类型Dat结构
更改为
类型Dat结构
”时——这里是否输入错误?@zerkms是的。我弄错了。这就是“当Dat结构类型更改为Dat结构类型时”。在我看来,这两个示例之间的主要区别在于,
Fn1a
修改现有值,而
Fn1b
分配并返回新值。至于哪一个更好,这完全取决于您的用例。@mkopriva感谢您的建议。您认为哪种功能适合哪种情况?谢谢您的建议。我想我能理解这些的区别。我想创建一个函数来初始化struct,使用示例2。如果我不想公开使用
Dat
,即我想使用
Dat
,我该怎么办?虽然我认为我使用接口返回int,它不是struct,但它不能像示例2那样使用。在示例2中,即使
Dat
是公共的,也没有问题吗?我很抱歉问了这个基本问题。