(답변보다 여전히 차이 및 관계를 명시하지 않았다 느낌이있어 string
와 []rune
내가 예와 다른 대답을 추가 할 것이다, 그래서 매우 명확합니다.)
으로 @Strangework
의 대답은 말했다, string
그리고 []rune
조용한 다르다.
차이점- string
& []rune
:
string value
읽기 전용 바이트 슬라이스입니다. 그리고 문자열 리터럴은 utf-8로 인코딩됩니다. 각 문자는 string
실제로 1 ~ 3 바이트 가 걸리고 각 문자 rune
는 4 바이트 가 걸립니다
- 의 경우 및 인덱스는
string
모두 len()
바이트를 기반으로합니다.
- 의 경우 및 인덱스는
[]rune
모두 len()
룬 (또는 int32)을 기반으로합니다.
관계- string
& []rune
:
- 에서
string
로 변환하면 []rune
해당 문자열의 각 utf-8 문자가로 변경 rune
됩니다.
- 마찬가지로 역변환에서에서
[]rune
로 변환 할 때 string
각각 rune
은의 utf-8 문자가됩니다 string
.
팁 :
string
와 사이를 변환 할 수 []rune
있지만 유형과 전체 크기가 서로 다릅니다.
(더 명확하게 보여주는 예를 추가하겠습니다.)
암호
string_rune_compare.go :
// string & rune compare,
package main
import "fmt"
// string & rune compare,
func stringAndRuneCompare() {
// string,
s := "hello你好"
fmt.Printf("%s, type: %T, len: %d\n", s, s, len(s))
fmt.Printf("s[%d]: %v, type: %T\n", 0, s[0], s[0])
li := len(s) - 1 // last index,
fmt.Printf("s[%d]: %v, type: %T\n\n", li, s[li], s[li])
// []rune
rs := []rune(s)
fmt.Printf("%v, type: %T, len: %d\n", rs, rs, len(rs))
}
func main() {
stringAndRuneCompare()
}
실행 :
string_rune_compare.go를 실행하십시오.
산출:
hello你好, type: string, len: 11
s[0]: 104, type: uint8
s[10]: 189, type: uint8
[104 101 108 108 111 20320 22909], type: []int32, len: 7
설명:
hello你好
처음 5 개의 문자는 각각 1 바이트 만 사용하고 마지막 2 개의 중국어 문자는 각각 3 바이트를 사용하므로 문자열의 길이는 11입니다.
- 그러므로,
total bytes = 5 * 1 + 2 * 3 = 11
- 이후
len()
문자열에서 바이트 단위에 기초 따라서, 첫번째 줄은 인쇄len: 11
- 문자열의 인덱스도 바이트를 기반으로하기 때문에 다음 두 줄은 유형의 값을 인쇄합니다
uint8
( byte
이는 별칭 유형이므로 uint8
계속).
변환 할 때 string
에 []rune
, 그것은 따라서 7 개 UTF8의 문자, 7 룬을 발견했다.
- 이후
len()
에이 []rune
룬에 기초하고, 따라서 마지막 라인이 인쇄 len: 7
.
[]rune
인덱스를 통해 조작하면 룬의 기본에 액세스합니다.
각 룬은 원래 문자열의 utf8 문자에서 왔으므로 len()
인덱스 작업 []rune
은 utf8 문자를 기반으로 한다고 말할 수 있습니다 .