Strings and Text Processing
String Runes
len counts bytes, while converting to []rune counts Unicode code points.
rune count
Go strings store bytes, and runes let code count Unicode characters more directly.
String Runes
string_runes.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
func main() {
var text = "Go"
bytes := len(text)
runes := len([]rune(text))
fmt.Println("text=", text)
fmt.Println("bytes=", bytes)
fmt.Println("runes=", runes)
fmt.Println("sameCount=", bytes == runes)
}
package main
import "fmt"
func main() {
var text = "Cafe"
bytes := len(text)
runes := len([]rune(text))
fmt.Println("text=", text)
fmt.Println("bytes=", bytes)
fmt.Println("runes=", runes)
fmt.Println("sameCount=", bytes == runes)
}
package main
import "fmt"
func main() {
var text = "\u4e16\u754c"
bytes := len(text)
runes := len([]rune(text))
fmt.Println("text=", text)
fmt.Println("bytes=", bytes)
fmt.Println("runes=", runes)
fmt.Println("sameCount=", bytes == runes)
}
text ← "Go", runes ← 2
5func main() {6 var text→ "Go" = "Go" //@text="Cafe", "\u4e16\u754c"7 bytes := len(text"Go")8 runes→ 2 := len([]rune(text"Go"))910 fmt.Println("text=", text"Go")11 fmt.Println("bytes=", bytes)12 fmt.Println("runes=", runes2)13 fmt.Println("sameCount=", bytes == runes2)14}outputtext= Go bytes= 2 runes= 2 sameCount= true
text ← "Cafe", runes ← 4
5func main() {6 var text→ "Cafe" = "Cafe"7 bytes := len(text"Cafe")8 runes→ 4 := len([]rune(text"Cafe"))910 fmt.Println("text=", text"Cafe")11 fmt.Println("bytes=", bytes)12 fmt.Println("runes=", runes4)13 fmt.Println("sameCount=", bytes == runes4)14}outputtext= Cafe bytes= 4 runes= 4 sameCount= true
text:8:"世界"@@END @@TRACE|string_runes.go|1|BEFORE|7.3-7.21:bytes := len(text)|7.16-7.20:text:8:"世界"@@END @@TRACE|string_runes.go|1|AFTER|7.3-7.21:bytes := len(text)|7.16-7.20:text:8:"世界"@@END @@TRACE|string_runes.go|1|BEFORE|8.3-8.29:runes := len([]rune(text))|8.23-8.27:text:8:"世界"@@END @@TRACE|string_runes.go|1|AFTER|8.3-8.29:runes := len([]rune(text))|8.3-8.8:runes ← 2
5func main() {6 var text→ 2 = "\u4e16\u754c"7 bytes := len(text)8 runes := len([]rune(text))910 fmt.Println("text=", text)11 fmt.Println("bytes=", bytes)12 fmt.Println("runes=", runes→ 2)13 fmt.Println("sameCount=", bytes == runes2)14}outputrunes= 2 sameCount= falsevalues this step2text:8:"世界"@@END @@TRACE|string_runes.go|1|BEFORE|10.3-10.29:fmt.Println("text=", text)|10.24-10.28:text:8:"世界"@@END @@TRACE|string_runes.go|1|STDOUT|10.3-10.29:fmt.Println("text=", text)|12:text= 世界@@END @@TRACE|string_runes.go|1|AFTER|10.3-10.29:fmt.Println("text=", text)|10.24-10.28:text:8:"世界"@@END @@TRACE|string_runes.go|1|BEFORE|11.3-11.31:fmt.Println("bytes=", bytes)|@@END @@TRACE|string_runes.go|1|STDOUT|11.3-11.31:fmt.Println("bytes=", bytes)|8:bytes= 6@@END @@TRACE|string_runes.go|1|AFTER|11.3-11.31:fmt.Println("bytes=", bytes)|@@END @@TRACE|string_runes.go|1|BEFORE|12.3-12.31:fmt.Println("runes=", runes)|12.25-12.30:runes