在这里查看我的代码
package main
import (
"fmt"
)
type iFormatter interface {
SetName(name string)
Format() string
}
type BaseFormatter struct {
name string
}
type Formatter struct {
BaseFormatter
}
func (f Formatter) SetName(name string) {
f.name = name
}
func (f Formatter) Format() string {
return "formatted " + f.name
}
func main() {
var formatters = []iFormatter{Formatter{}}
formatters[0].SetName("KARL")
fmt.Println(formatters[0].Format())
}
我不明白,为什么在调用SetName后没有设置字段“name”。
以下是playground https://play.golang.org/p/Jkcjv_hFRC的链接。
答案 0 :(得分:2)
SetName()
方法应该在指针上,而不是值。目前,f
是formatters[0]
的副本,对f
的更改不会传播到formatters[0]
。
下面的代码可以解决问题。
func (f *Formatter) SetName(name string) {
f.name = name
}
...
var formatters = []iFormatter{&Formatter{}}
您不需要将Format()
方法更改为指针接收器,但在您的情况下,可能更好。
答案 1 :(得分:0)
在您的代码中,更改这两个方法应该使其按预期工作:
func (f *Formatter) SetName(name string) {
f.name = name
}
func (f *Formatter) Format() string {
return "formatted " + f.name
}
并使用指针
var formatters = []iFormatter{&Formatter{}}
基本上,使用指针接收器而不是值接收器。使用值接收器可以处理结构的副本而不是原始结构。