這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
impolde 方法是 php 中常用的字串拼接方法, 在golang 中也有字串拼接的函數:
strings.Join(a []string, sep string) string
此函數與implode類似, 但有個缺點: 第一個參數必須是 []string, 如果想將[]int 拼接為字串就需要轉換.
下面利用反射實現一個通用的"implode"方法:
func Implode(list interface{}, seq string) string { listValue := reflect.Indirect(reflect.ValueOf(list)) if listValue.Kind() != reflect.Slice { return "" } count := listValue.Len() listStr := make([]string, 0, count) for i := 0; i < count; i++ { v := listValue.Index(i) if str, err := getValue(v); err == nil { listStr = append(listStr, str) } } return strings.Join(listStr, seq)}func getValue(value reflect.Value) (res string, err error) { switch value.Kind() { case reflect.Ptr: res, err = GetValue(value.Elem()) default: res = fmt.Sprint(value.Interface()) } return}
然後簡單做個測試:
func TestImplode(t *testing.T) { list := []int{1, 2, 3, 4, 5, 6, 7} res := Implode(list, ",") fmt.Println(res) list1 := []int16{1, 2, 3, 4, 5, 6, 7} res = Implode(list1, ",") fmt.Println(res) list2 := []float64{1.5, 2.1, 3.0, 4, 5.9, 6.7, 7.7} res = Implode(list2, ",") fmt.Println(res) var list3 []float64 res = Implode(list3, ",") fmt.Println("res: ", res) list4 := make([]interface{}, 4, 4) list4[0] = "str" list4[1] = 19 list4[2] = 19.999 list4[3] = true res = Implode(list4, ",") fmt.Println(res)}
輸出:
1,2,3,4,5,6,71,2,3,4,5,6,71.5,2.1,3,4,5.9,6.7,7.7res: str,19,19.999,true
是不是方便很多 :)