Pointers 如何在围棋中使用接收器?
下面是两个代码示例 示例1: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
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
是公共的,也没有问题吗?我很抱歉问了这个基本问题。