遵循在线课程,尝试教自己一些Go语言。 而且我正在尝试偏离路线,以扩大我的学习范围。

课程中,我们使用几个变量编写了一个简单的函数,该函数将采用两个变量并打印出一行。 所以我有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    func main() {

        var greeting :="hello"
        var name :="cleveland"

        message := printMessage(greeting,name)
        fmt.Println(message)

    }

    func printMessage(greeting string, name string) (message string) {

        return greeting +"" + name +"!"

    }

之后的课程介绍了一种使用来创建字符串的伪数组的方法

1
2
3
4
5
6
    func sayHello (cities ...string) (message string) {
        for _, city := range cities {
            message := printMessage("hello", city)
            fmt.Println(message)
        }
    }

我想创建一个带有不同问候语的结构,并将其传递给sayHello函数。 因此,struct和变量看起来像这样:

1
2
3
4
5
6
7
8
9
10
    type cityInfo struct {
        greeting string
        name string
        wins float32
        gamesPlayed float32
    }

    city1 := cityInfo{"hello","cleveland"}
    city2 := cityInfo{"good morning","atlanta"}
    ...and so on

如何格式化函数以将这些结构传递到函数中,以便可以迭代结构的数量并使用city.greeting和city.name获取问候语和名称? 这个问题有意义吗?


函数参数类型可以是任何有效类型:

1
2
3
4
5
6
func sayHello (cities ...cityInfo) {
    for _, city := range cities {
        message := printMessage(city.greeting, city.name)
        fmt.Println(message)
    }
}

一种解决方案是创建界面和问候方法。

例如:

1
2
3
4
type Greetable interface {
    Greeting() string
    Name() string
}

然后,您将在结构中实现Greeting和Name方法(由于Go处理接口的方式,这将立即实现Greetable接口):

1
2
3
4
5
6
7
8
9
10
11
12
type cityInfo struct {
    name     string
    greeting string
}

func (city *cityInfo) Greeting() string {
    return city.greeting
}

func (city *cityInfo) Name() string {
    return city.name
}

然后您的函数将只接受任何实现Greetable的东西:

1
func sayHello(greetables ...Greetable) (message string)

并改用Name()Greeting()方法。

  • 抱歉,我不确定我是否遵循此步骤。 像这样有点道理,但是我不确定到目前为止我所建议的东西在哪里(或它将取代什么)。 所以结构将是type cityInfo struct { func (city *cityInfo) Name() string ... }? 我想我错过了一些东西。
  • 在Go中,您可以在类型本身之外定义方法。 例如:type cityInfo struct { name string } func (city *cityInfo) Name() { return city.name }
  • 好。 我想我现在知道了。 也将尝试此解决方案。 谢谢!