Go,Golang:遍历struct

时间:2013-10-18 00:09:53

标签: go

http://play.golang.org/p/fJACxhSrXX

我想遍历一系列结构。

 func GetTotalWeight(data_arr []struct) int {
    total := 0
    for _, elem := range data_arr {
        total += elem.weight
    }
    return total
 }

但我收到语法错误

   syntax error: unexpected ), expecting {

是否可以遍历结构?

2 个答案:

答案 0 :(得分:12)

您的功能几乎完全正确。您希望将TrainData定义为type,并将GetTotalWeight的类型签名更改为[]TrainData,而不是[]struct,如下所示:

import "fmt"

type TrainData struct {
    sentence string
    sentiment string
    weight int
}

var TrainDataCity = []TrainData {
    {"I love the weather here.", "pos", 1700},
    {"This is an amazing place!", "pos", 2000},
    {"I feel very good about its food and atmosphere.", "pos", 2000},
    {"The location is very accessible.", "pos", 1500},
    {"One of the best cities I've ever been.", "pos", 2000},
    {"Definitely want to visit again.", "pos", 2000},
    {"I do not like this area.", "neg", 500},
    {"I am tired of this city.", "neg", 700},
    {"I can't deal with this town anymore.", "neg", 300},
    {"The weather is terrible.", "neg", 300},
    {"I hate this city.", "neg", 100},
    {"I won't come back!", "neg", 200},
}

func GetTotalWeight(data_arr []TrainData) int {
    total := 0
    for _, elem := range data_arr {
        total += elem.weight
    }
    return total
}

func main() {
    fmt.Println("Hello, playground")
    fmt.Println(GetTotalWeight(TrainDataCity))
}

运行此命令:

Hello, playground
13300

答案 1 :(得分:1)

range关键字仅适用于字符串,数组,切片和通道。所以,不可能用range迭代结构。但是你提供了一个切片,所以这不是问题。问题是函数的类型防御。 你写道:

func GetTotalWeight(data_arr []struct) int

现在问问自己:我在这里要求的是什么类型?

[]开头的所有内容都表示一个切片,因此我们处理一块结构。 但是什么类型的结构?匹配ever struct的唯一方法是使用 界面值。否则,您需要提供显式类型,例如 TrainData

这是语法错误的原因是语言允许的唯一时间 struct关键字用于定义新结构。结构定义有 struct关键字,后跟一个{,这就是编译器告诉你他期望的原因 {

结构定义示例:

a := struct{ a int }{2} // anonymous struct with one member