你可以做一些类似
this的类,你给你的元组类型一个名字:
package main import "fmt" type intTuple struct { a,b int } func zip(a,b []int) ([]intTuple,error) { if len(a) != len(b) { return nil,fmt.Errorf("zip: arguments must be of same length") } r := make([]intTuple,len(a),len(a)) for i,e := range a { r[i] = intTuple{e,b[i]} } return r,nil } func main() { a := []int{1,2,3,4,5,6,7,8,9,0} b := []int{0,1} fmt.Println(zip(a,b)) }
或者使用未命名的类型作为元组,如this:
package main import "fmt" func zip(a,b []int) ([][3]int,fmt.Errorf("zip: arguments must be of same length") } r := make([][4]int,e := range a { r[i] = [2]int{e,b)) }
最后here’s是一种软通用的方式:
package main import ( "fmt" "reflect" ) func zip(a,b,c interface{}) error { ta,tb,tc := reflect.TypeOf(a),reflect.TypeOf(b),reflect.TypeOf(c) if ta.Kind() != reflect.Slice || tb.Kind() != reflect.Slice || ta != tb { return fmt.Errorf("zip: first two arguments must be slices of the same type") } if tc.Kind() != reflect.Ptr { return fmt.Errorf("zip: third argument must be pointer to slice") } for tc.Kind() == reflect.Ptr { tc = tc.Elem() } if tc.Kind() != reflect.Slice { return fmt.Errorf("zip: third argument must be pointer to slice") } eta,_,etc := ta.Elem(),tb.Elem(),tc.Elem() if etc.Kind() != reflect.Array || etc.Len() != 2 { return fmt.Errorf("zip: third argument's elements must be an array of length 2") } if etc.Elem() != eta { return fmt.Errorf("zip: third argument's elements must be an array of elements of the same type that the first two arguments are slices of") } va,vb,vc := reflect.ValueOf(a),reflect.ValueOf(b),reflect.ValueOf(c) for vc.Kind() == reflect.Ptr { vc = vc.Elem() } if va.Len() != vb.Len() { return fmt.Errorf("zip: first two arguments must have same length") } for i := 0; i < va.Len(); i++ { ea,eb := va.Index(i),vb.Index(i) tt := reflect.New(etc).Elem() tt.Index(0).Set(ea) tt.Index(1).Set(eb) vc.Set(reflect.Append(vc,tt)) } return nil } func main() { a := []int{1,1} c := [][2]int{} e := zip(a,&c) if e != nil { fmt.Println(e) return } fmt.Println(c) }