I have a function that takes in a string, and checks to see if that string is present in a list of other strings. Simple enough.
func (s *Foo) validateCurrency(currency string) error {
for _, currency := range s.Config.Currencies {
if currency.Name() == currency {
return nil
}
}
return ErrCurrencyNotFound
}
This is the Currency
struct:
type Currency struct {
name string
// ...
}
func (c *Currency) Name() string {
return c.name
}
Yet I seem to be getting this error:
invalid operation: currency.Name() == currency (mismatched types string and *config.Currency)
Why on earth is the Go compiler yelling at me? I don't get it... both are strings. currency.Name()
returns a string. Why does the error say it returns a *config.Currency
?
You're shadowing currency
in the for loop. Look at this code for a simpler example: https://play.golang.org/p/UFmwqQ4JZtG
First assignment to currency
-> func (s *Foo) validateCurrency(currency string) error {
Second assignment which shadows the first: -> for _, currency := range s.Config.Currencies {
Change one of those variable names for a fix.
Your for
loop defines a variable named currency
of type Currency
. Your function has a parameter also named currency
, but of type string
. This causes currency
inside the for
loop to see the value of the currency
of type Currency
as defined in the loop instead of the function's parameter.
In short, you have two variables named currency
, but can only access the one most recently defined.
To fix this, you should rename one of your currency
variables to something else.