package main import ( "bytes" "fmt" "math/rand" "strings" "time" ) var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") func RandStringRunes(n int) string { b := make([]rune, n) for i := range b { b[i] = letterRunes[rand.Intn(len(letterRunes))] } return string(b) } func appendStrings() { total := 1503259 result := "" for i := 0; i < total; i++ { result += RandStringRunes(10) + "/" + RandStringRunes(10) + "/" + RandStringRunes(10) + RandStringRunes(10) + "\n" if i%500 == 0 { fmt.Println("Progress: ", i, "/", total) } } fmt.Println(result[:100]) } func appendStringsUsingBuffer() { total := 1503259 result := "" var buf bytes.Buffer for i := 0; i < total; i++ { buf.WriteString(RandStringRunes(10) + "/" + RandStringRunes(10) + "/" + RandStringRunes(10) + RandStringRunes(10) + "\n") if i%500 == 0 { fmt.Println("Progress: ", i, "/", total) } } result = buf.String() fmt.Println(result[:100]) } func appendStringsUsingBuilder() { total := 1503259 result := "" var sb strings.Builder for i := 0; i < total; i++ { sb.WriteString(RandStringRunes(10) + "/" + RandStringRunes(10) + "/" + RandStringRunes(10) + RandStringRunes(10) + "\n") if i%500 == 0 { fmt.Println("Progress: ", i, "/", total) } } result = sb.String() fmt.Println(result[:100]) } func main() { rand.Seed(time.Now().UnixNano()) // appendStrings() // appendStringsUsingBuffer() appendStringsUsingBuilder() }
buffer나 strings.Builder 를 쓰라고 한다.
뭐, for 바깥에 for를 하나 더 씌워서 느려지지 않는 선에서 슬라이스로 끊어서 갖고 있다가 마지막에 합쳐도 되긴 된다.
문자열 합칠 때 + 함부로 쓰면 안되겠다
https://stackoverflow.com/questions/1760757/how-to-efficiently-concatenate-strings-in-go
https://github.com/golang/go/issues/16796
끝.
댓글 0