Golang实现类似Python的zip功能生成姓名年龄元组遇语法错误求解
代码踩的具体坑
- 语法报错的直接原因:Go没有Python那种原生元组的传参语法,你写的
stringTuple[(value, b[index])]完全是把其他语言的习惯硬套过来。编译器看到你在结构体构造的括号里直接塞带逗号的两个值,根本不知道要往哪个字段赋值,所以直接抛出unexpected comma, expecting )的语法错误。 - 类型不匹配的硬伤:
zip函数声明的返回值是[]stringTuple(即该结构体类型的切片),但你在函数内部用make(map[int][]stringTuple)创建的是键为int、值为结构体切片的map,两者类型完全不兼容,就算修好语法错误也无法通过类型检查。 - 集合类型用错:你要的是按顺序一一对应的列表结构,用切片实现才符合需求,完全没必要用map存下标映射。
修正后的可运行代码
package main import ( "fmt" "strings" ) // 保留你自定义的元组类型 type stringTuple struct { names string ages string } // 可选项:自定义打印格式,匹配Python zip结果的显示效果 func (s stringTuple) String() string { return fmt.Sprintf("(%q, %q)", s.names, s.ages) } func main() { var names = "bob julie mark mike" namesArray := strings.Split(names, " ") fmt.Println(namesArray) var ages = "20,30,40,50" agesArray := strings.Split(ages, ",") fmt.Println(agesArray) fmt.Println(zip(namesArray, agesArray)) } func zip(a []string, b []string) ([]stringTuple, error) { if len(a) != len(b) { return nil, fmt.Errorf("zip: arguments length must be same") } // 创建和返回值类型完全匹配的切片,提前分配好对应容量减少扩容开销 result := make([]stringTuple, 0, len(a)) for index, value := range a { // 按Go结构体语法初始化实例,追加到切片中 // 因为结构体字段顺序固定,也可以简写为 stringTuple{value, b[index]} result = append(result, stringTuple{ names: value, ages: b[index], }) } return result, nil }
运行效果
加上自定义的String()方法后,最终打印的结果完全匹配你预期的格式:[("bob", "20"), ("julie", "30"), ("mark", "40"), ("mike", "50")]
内容的提问来源于stack exchange,提问作者Raja G
相关产品推荐
相关产品推荐

