我有一个接受字符串的函数,并检查该字符串是否存在于其他字符串列表中。很简单。
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
?
答案 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 {
更改其中一个变量名称以进行修复。