package main
import (
"fmt"
)
func main() {
s := "你好,世界.æ"
for i, b := range []byte(s) {
fmt.Printf("%d %d
", i, b) //i=0~15 ; 3*4+2*1+1*2 = 16
}
n := len(s) //len(string) = the number of bytes.
for i:=0;i<n;i++ {
fmt.Printf("%d %d
", i, s[i]) //效果同上
}
for i, c := range s {
//按rune字符迭代
fmt.Printf("%d %d %c
", i, c,c) //0 20320 你,1 22909 好,2 44 ,,3 19990 世,4 30028 界,5 46 .,6 230 æ
// string(c) 字符转为字符串 , []byte(s) 字符串转byte数组:byte数组和字符串的转换效率非常高 O(1)
fmt.Println([]byte(string(b)))
/*
这里可以很清楚的看到 汉字:3byte; ascii:1byte; 英语音标字符:2byte
[228 189 160]
[229 165 189]
[44]
[228 184 150]
[231 149 140]
[46]
[195 166]
*/
}
// The len built-in function returns the length of v, according to its type:
// Array: the number of elements in v.
// Pointer to array: the number of elements in *v (even if v is nil).
// Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
// String: the number of bytes in v.
// Channel: the number of elements queued (unread) in the channel buffer;
// if v is nil, len(v) is zero.
//对于指针类型,只有数组的指针可以取 len
a := [4]int{1,2,3}
fmt.Println(len(a)) //4
fmt.Println(len(&a)) //4 对数组指针取len 就是数组的长度
fmt.Println(len(*&a)) //4
b := []int{1,2,3}
fmt.Println(len(b)) //3
//fmt.Println(len(&b)) invalid 对切片引用的指针取 len 是非法的
fmt.Println(len(*&b)) //4
//fmt.Println(len(&s)) invalid 对字符串指针取 len 是非法的。
}