58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"reflect"
|
|
"fmt"
|
|
)
|
|
|
|
// Generic version
|
|
// Easier to make the generic version accept any number of arguments,
|
|
// and loop trough them. Otherwise there will be lots of code duplication.
|
|
func ArrayConcat(arrays ...interface{}) interface{} {
|
|
if len(arrays) == 0 {
|
|
panic("Need at least one arguemnt")
|
|
}
|
|
var vals = make([]*reflect.SliceValue, len(arrays))
|
|
var arrtype *reflect.SliceType
|
|
var totalsize int
|
|
for i,a := range arrays {
|
|
v := reflect.NewValue(a)
|
|
switch t := v.Type().(type) {
|
|
case *reflect.SliceType:
|
|
if arrtype == nil {
|
|
arrtype = t
|
|
} else if t != arrtype {
|
|
panic("Unequal types")
|
|
}
|
|
vals[i] = v.(*reflect.SliceValue)
|
|
totalsize += vals[i].Len()
|
|
default: panic("not a slice")
|
|
}
|
|
}
|
|
ret := reflect.MakeSlice(arrtype,totalsize,totalsize)
|
|
targ := ret
|
|
for _,v := range vals {
|
|
reflect.Copy(targ, v)
|
|
targ = targ.Slice(v.Len(),targ.Len())
|
|
}
|
|
return ret.Interface()
|
|
}
|
|
|
|
// Type specific version
|
|
func ArrayConcatInts(a, b []int) []int {
|
|
ret := make([]int, len(a) + len(b))
|
|
copy(ret, a)
|
|
copy(ret[len(a):], b)
|
|
return ret
|
|
}
|
|
|
|
func main() {
|
|
test1_a, test1_b := []int{1,2,3}, []int{4,5,6}
|
|
test1_c := ArrayConcatInts(test1_a, test1_b)
|
|
fmt.Println(test1_a, " + ", test1_b, " = ", test1_c)
|
|
|
|
test2_a, test2_b := []string{"a","b","c"}, []string{"d","e","f"}
|
|
test2_c := ArrayConcat(test2_a, test2_b).([]string)
|
|
fmt.Println(test2_a, " + ", test2_b, " = ", test2_c)
|
|
}
|