【Duke】字符串 010 - PingPongGooo/GoFoundation GitHub Wiki

字符串

与其他主要编程语言的差异

  1. string 是数据类型,不是引用或指针类型
  2. string 是只读的byte slice, len函数 获得 它所包含的 byte数
  3. string 的byte数组可以存放任何数据

Unicode UTF8

  1. Unicode 是一种字符集 (code point)
  2. 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)
	}
}