【Duke】字符串 010 - PingPongGooo/GoFoundation GitHub Wiki
字符串
与其他主要编程语言的差异
- string 是数据类型,不是引用或指针类型
- string 是只读的byte slice, len函数 获得 它所包含的 byte数
- string 的byte数组可以存放任何数据
Unicode UTF8
- Unicode 是一种字符集 (code point)
- UTF8是unicode的存储实现 (转换为字节序列的规则)
func TestString(t *testing.T) {
var s string
t.Log(s) // 初始化为默认值 ""
s = "hello"
t.Log(len(s))
//s[1] = '3' // string 是不可变的byte slice
s = "\xE4\xB8\xA5" // 可以存储任何二进制数据
t.Log(s)
s = "中"
t.Log(len(s)) // 是byte数
c:= []rune(s) // 通过 rune 函数,可以获取 字符串的 unicode
t.Log(len(c))
t.Log("rune size:",unsafe.Sizeof(c[0]))
t.Logf("中 unicode %x",c[0])
t.Logf("中 UTF8 %x",s)
}
编码与存储
字符 “中”
Unicode 0x4E2D
UTF-8 0xE4B8AD
string/[]byte [0xE4,0xB8,0xAD]
常用字符串函数
1. strings 包 (https://golang.org/pkg/strings/)
2. strconv 包 (https://golang.org/pkg/strconv/)
func TestStringToRune(t *testing.T){
s := "中华人民共和国"
for _, c := range s{
t.Logf("%[1]c %[1]d",c) // [1] 两个都对应第一个参数 c
}
}
func TestStringFn(t *testing.T) {
s:="A,B,C"
parts := strings.Split(s,",")
for _, part := range parts{
t.Log(part)
}
t.Log(strings.Join(parts,"-"))
}
func TestConv(t *testing.T) {
s:=strconv.Itoa(10)
t.Log("str"+s)
if i,err := strconv.Atoi("10") ; err == nil{
t.Log(10+i)
}
}