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

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.