Golang:将结构作为函数

时间:2017-09-07 23:14:14

标签: go struct

尝试通过在线课程自学一些Go。而且我试图稍微偏离我的学习过程。

本课程让我们使用几个变量编写一个简单的函数,函数将获取两个变量并打印出一行。所以我有:

    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 + "!"

    }

后来本课程介绍了一种使用

创建字符串伪数组的方法
    func sayHello (cities ...string) (message string) {
        for _, city := range cities {
            message := printMessage("hello", city)
            fmt.Println(message)
        }
    }

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

    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迭代结构数并获取问候语和名称?这个问题有意义吗?

2 个答案:

答案 0 :(得分:1)

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

func sayHello (cities ...cityInfo) {
    for _, city := range cities {
        message := printMessage(city.greeting, city.name)
        fmt.Println(message)
    }
}

答案 1 :(得分:0)

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

例如:

type Greetable interface {
    Greeting() string
    Name() string
}

然后,您将在结构中实现Greeting和Name方法(这将立即实现Greetable接口,due to the way that Go handles interfaces):

type cityInfo struct {
    name     string
    greeting string
}

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

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

然后你的函数会接受任何实现Greetable的东西:

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

然后使用Name()Greeting()方法。

相关问题