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