将值设置为继承的字段

时间:2017-10-05 13:58:30

标签: go interface

在这里查看我的代码

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的链接。

2 个答案:

答案 0 :(得分:2)

SetName()方法应该在指针上,而不是值。目前,fformatters[0]的副本,对f的更改不会传播到formatters[0]

下面的代码可以解决问题。

func (f *Formatter) SetName(name string) {
    f.name = name
}

...

var formatters = []iFormatter{&Formatter{}}

您不需要将Format()方法更改为指针接收器,但在您的情况下,可能更好。

请参阅:https://play.golang.org/p/rFmCZesbTB

答案 1 :(得分:0)

在您的代码中,更改这两个方法应该使其按预期工作:

func (f *Formatter) SetName(name string) {
    f.name = name
}
func (f *Formatter) Format() string {
    return "formatted " + f.name
}

并使用指针

var formatters = []iFormatter{&Formatter{}}

return

基本上,使用指针接收器而不是值接收器。使用值接收器可以处理结构的副本而不是原始结构。