func Join(a []string, sep string) string { switch len(a) { case 0: return "" case 1: return a[0] case 2: // Special case for common small values. // Remove if golang.org/issue/6714 is fixed return a[0] + sep + a[1] case 3: // Special case for common small values. // Remove if golang.org/issue/6714 is fixed return a[0] + sep + a[1] + sep + a[2] } // 计算拼接后的字符串长度 n := len(sep) * (len(a) - 1) // 分隔符的总长度(需要多少个分隔符就把它们的长度都加起来) for i := 0; i < len(a); i++ { // 然后n加上各个字符串加起来的长度 n += len(a[i]) } b := make([]byte, n) bp := copy(b, a[0]) // 将字符串当成[]byte类型的slice, 并添加进去 // copy会返回两个参数中长度较短的那个参数的长度 // 循环遍历剩余的字符串, 并把字符串添加进b([]byte)中 for _, s := range a[1:] { // 以返回的长度为下标并在这个slice后面添加分隔符(sep), 并把bp当前长度记住 bp += copy(b[bp:], sep) // 以返回的长度为下标并在这个slice后面添加字符串(s), 并把bp当前长度记住 bp += copy(b[bp:], s) } return string(b) }