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

text
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)
}
  1. 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
  1. 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
  1. 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= false
    values 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