(มีความรู้สึกว่าคำตอบข้างต้นยังไม่ได้ระบุความแตกต่างและความสัมพันธ์ระหว่างstring
และ[]rune
ชัดเจนมากดังนั้นฉันจะพยายามเพิ่มคำตอบด้วยตัวอย่าง)
ตามที่@Strangework
ได้รับคำตอบstring
และ[]rune
เงียบแตกต่างกัน
ความแตกต่าง - string
& []rune
:
string value
เป็นชิ้นไบต์แบบอ่านอย่างเดียว และสตริงตัวอักษรถูกเข้ารหัสใน utf-8 ถ่านแต่ละตัวstring
จะใช้เวลา1 ~ 3ไบต์ในขณะที่แต่ละตัวrune
ใช้เวลา4ไบต์
- สำหรับ
string
ทั้งสองlen()
และดัชนีจะขึ้นอยู่กับไบต์
- สำหรับ
[]rune
ทั้งสองlen()
และดัชนีจะขึ้นอยู่กับ rune (หรือ 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
คำอธิบาย: