4.1 字符串
peter 611 3

字符串

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

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

测试实例 1

func TestString(t *testing.T)  {
    var s string
    t.Log(s)  // 初始化为默认零值""
    s = "hello"
    t.Log(len(s))  // 5
    // s[1] = '3' // cannot assign to s[1]; 这意味着 string 是不可变的 byte slice
    s = "\xE4\xB8\xA5"  // 可以存储任何二进制数据
    // s = "\xE4\xBA\xB5\xFF"
    t.Log(s)
    t.Log(len(s)) // 3  len 求出来的 s 的 byte 数,并不一定是里面的字符数
}

Unicode UTF8

  1. Unicode 是一种字符集(code point)
  2. UTF8 是 unicode 的存储实现(转化为字节顺序的规则)

测试实例 2

func TestString(t *testing.T)  {
    s = "中"
    t.Log(len(s))  // 3 是 byte 的长度
    // rune 能够取出字符串里的 unicode
    c := []rune(s)
    t.Log(len(c))  // 1
    t.Log("rune size:", unsafe.Sizeof(c[0]))  // rune size: 4
    t.Logf("中 unicode %x", c[0])  // 中 unicode 4e2d
    t.Logf("中 UTF8 %x", s)  // 中 UTF8 e4b8ad
}

编码与存储

字符 "中"
Unicode 0x4E2D
UTF-8 0xE4B8AD
String/[]byte [0xE4, 0xB8, 0xAD]

测试实例 3

func TestStringToRune(t *testing.T)  {
    s := "中华人民共和国"
    // range 和字符串配合输出的是 rune 而不是 byte
    for _, c := range s {
        // 这种方式,表示,%c,%x 都是与第一个参数对应
        t.Logf("%[1]c %[1]x", c)
    }
}

// 输出结果
//=== RUN   TestStringToRune
//string_test.go:34: 中 4e2d
//string_test.go:34: 华 534e
//string_test.go:34: 人 4eba
//string_test.go:34: 民 6c11
//string_test.go:34: 共 5171
//string_test.go:34: 和 548c
//string_test.go:34: 国 56fd
//--- PASS: TestStringToRune (0.00s)
//PASS

常用字符串函数

  1. strings 包
  2. strconv 包

测试实例 4

package string

import (
    "strconv"
    "strings"
    "testing"
)

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) {
    // int 转字符串
    s := strconv.Itoa(10)
    t.Log("str" + s)  // str10
    // 字符串转 int
    if i, err := strconv.Atoi("10"); err == nil {
        t.Log(10 + i)  // 20
    }
}
评论区

索引目录