Golang parse array
我正试图弄明白我的代码为什么不能工作。我想把数字和字符串分成三部分。对于切片中的每个元素,如果它是字符串,则将其附加到字符串切片;如果它是正数,则将其附加到正数,同样也将其附加到负数。然而,这里是输出
姓名:埃夫特林贝45.39934611083154号-75.71148292845268
[风景-75.73795670904249贝尔维埃曼-75.73886856878032杜奇索-75.66809864107668…
阳性:[45.344387632924054 45.37223315413918…]底片:[]
这是我的密码。有人能告诉我是什么导致负数数组没有任何值吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | func main() { fmt.Printf("%q ", strings.Split("a,b,c",",")) var names []string var positives, negatives []float64 bs, err := ioutil.ReadFile("poolss.txt") if err != nil { return } str := string(bs) fmt.Println(str) tokens := strings.Split(str,",") for _, token := range tokens { if num, err := strconv.ParseFloat(token, 64); err == nil { if num > 0 { positives = append(positives, num) } else { negatives = append(negatives, num) } } else { names = append(names, token) } fmt.Println(token) } fmt.Println(fmt.Sprintf("Strings: %v",names)) fmt.Println(fmt.Sprintf("Positives: %v", positives)) fmt.Println(fmt.Sprintf("Negatives: %v",negatives)) for i := range names{ fmt.Println(names[i]) fmt.Println(positives[i]) fmt.Println(negatives[i]) } } |
上面的问题可能在于每个浮动附加的额外项-如果以换行符结尾,则不会得到负项,如果结尾没有换行符,则会得到负项。所以插入一个printf,这样您就可以看到strconv.parsefloat中的错误,所有的错误都会变得清晰。
可能有助于:
- 检查错误,不要依赖于一个错误只有一种类型(这会使您在这里感到困惑)-如果错误到达,请始终打印它,特别是在调试时。
- 不要为变量(字符串)使用包的名称,它不会很好地结束。
- 使用反映数据的数据结构
- 使用csv包读取csv数据
小精灵
例如,为了存储您可能需要的数据:
1 2 3 4 5 | type Place struct { Name string Latitude int64 Longitude int64 } |
。
然后根据cols是按给定顺序排列的这一事实将数据读入其中,并将其存储在[]位置。
这是我试过的,现在可以用了!谢谢大家的帮助!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | func main() { findRoute("poolss.csv", 5) } func findRoute( filename string, num int) []Edge { var route []Edge csvFile, err := os.Open(filename) if err != nil { return route } reader := csv.NewReader(bufio.NewReader(csvFile)) var pools []Pool for { line, error := reader.Read() if error == io.EOF { break } else if error != nil { log.Fatal(error) } lat, err := strconv.ParseFloat(line[1], 64) long, err := strconv.ParseFloat(line[2], 64) if err == nil { pools = append(pools, Pool{ name: line[0], latitude: lat, longitude: long, }) } } return route } |
您的代码使用
1 | var strings []string |
以
1 | tokens := strings.Split(str,",") |
号
别这样!
1 | strings.Split undefined (type []string has no field or method Split) |
游乐场:https://play.golang.org/p/hfzgj0jot-p