无效操作:currency.Name()== currency(不匹配类型字符串和* config.Currency)

时间:2018-04-10 22:11:15

标签: go

我有一个接受字符串的函数,并检查该字符串是否存在于其他字符串列表中。很简单。

func (s *Foo) validateCurrency(currency string) error {
    for _, currency := range s.Config.Currencies {
        if currency.Name() == currency {
            return nil
        }
    }
    return ErrCurrencyNotFound
}

这是Currency结构:

type Currency struct {
    name    string
    // ...
}

func (c *Currency) Name() string {
    return c.name
}

然而我似乎得到了这个错误:

  

无效操作:currency.Name()== currency(不匹配的类型   string和* config.Currency)

为什么Go编译器会对我大喊大叫?我不明白......两者都是字符串。 currency.Name()返回一个字符串。为什么错误说它返回*config.Currency

2 个答案:

答案 0 :(得分:3)

您的for循环定义了currency类型Currency的变量。您的函数有一个名为currency的参数,但类型为string。这会导致currency循环中的for看到循环中定义的类型currency的{​​{1}}的值,而不是函数的参数。

简而言之,您有两个名为Currency的变量,但只能访问最近定义的变量。

要解决此问题,您应该将其中一个currency变量重命名为其他内容。

答案 1 :(得分:2)

你在for循环中隐藏了id:1022 mname:P1 target:host.domain.com pname:P1A xnode:1 id:1022 mname:P1 target:host.domain.com pname:P1A remote:1 。请查看此代码以获取更简单的示例:https://play.golang.org/p/UFmwqQ4JZtG

首次转让给currency - > currency

影响第一个的第二个任务: - > func (s *Foo) validateCurrency(currency string) error {

更改其中一个变量名称以进行修复。