문자열 변환
문자열은 유니코드 문자의 코드값을 정수로 표현한 값(rune 또는 int32)의 시퀀스이므로 []rune(또는 []int32)으로 변환할 수 있다. 1바이트로 표현할 수 있는 아스키 문자열은 []byte(또는 []uint8)로 변환할 수 있다. 아스키가 아닌 문자열을 []byte로 변환하면 잘못된 코드값으로 변환될 수 있으니 주의해야 한다.
[]rune(s) |
문자열 s를 유니코드 문자의 코드값 배열([]rune 또는 []int32)로 변환 |
[]byte(s) |
문자열 s를 바이트 배열([]byte 또는 []uint)로 변환 |
string(chars) |
유니코드 문자의 코드값 배열([]rune 또는 []int32)을 문자열로 변환 |
string(i) |
유니코드의 코드 포인트 i를 문자열로 변환(i가 65라면 “A”로 변환) |
문자열 "hello ", "안녕하세요"와 코드값 배열 []byte, []rune 간의 변환을 시도해 보았다.
s1 := "hello" fmt.Println([]rune(s1)) // [104 101 108 108 111] fmt.Println([]byte(s1)) // [104 101 108 108 111] fmt.Println(string([]byte{104, 101, 108, 108, 111})) // hello fmt.Println(string([]rune{104, 101, 108, 108, 111})) // hello s2 := "안녕하세요" fmt.Println([]rune(s2)) // [50504 45397 54616 49464 50836] fmt.Println([]byte(s2)) // [236 149 136 235 133 149 237 149 152 236 132 184 236 154 148] // 안녕하세요 fmt.Println(string([]rune{50504, 45397, 54616, 49464, 50836})) // 안녕하세요 fmt.Println(string([]byte{236, 149, 136, 235, 133, 149, 237, 149, 152, 236, 132, 184, 236, 154, 148})) fmt.Println(string(104)) // h fmt.Println(string(236)) // ì fmt.Println(string(50504)) // 안 fmt.Println(string([]byte{236, 149, 136})) // 안
문자열 길이
문자열의 바이트 수를 구할 때는 len() 함수를 사용한다. 바이트가 아니라 문자열의 내부 문자 수를 구할 때는 unicode/utf8 패키지의 utf8.R uneC ountI nS tring() 함수를 사용하거나, 문자열을 []rune 타입으로 변환하고 변환한 값의 길이(len([] rune()))를 구하면 된다.
package main import ( "fmt" "unicode/utf8" ) func main() { s1 := "hello" s2 := "안녕하세요" fmt.Println(len(s1)) // 5 fmt.Println(len(s2)) // 15 fmt.Println(utf8.RuneCountInString(s2)) // 5 fmt.Println(len([]rune(s2))) // 5 }
실행 결과
5
15
5
5