3.4. 字符串

字符串在凹语言中被视为基础数据类型,类型名称为:string,字符串字面常量通过双引号 "" 括起定义,采用 UTF-8 编码,例如:

    s: string = "你好,凹语言"
    println(s)     // 你好,凹语言
    println("+42") // +42

与整数、浮点数类似,字符串变量也可以使用 := 快捷定义,例如:

    s := "编号9527"

字符串支持加法(+)双目操作,返回值为两个字符串的连接,例如:

    s1 := "abc"
    s2 := "123"
    println(s1 + s2) // abc123

容纳字符串的底层结构是一个字节(既u8)数组,可以使用 [] 获取其中某个字节的数值,或一个子串,例如:

    s := "abcdefg"
    println(s[2])   // 99,既 'c' 的ASCII值
    println(s[1:3]) // bc

在这种用法中,[] 内的下标单位是字节,而不是字符。如果源字符串包含非 ASCII 码字符(如中文字符),而下标未处于整字符边界处,则返回的子字串可能非法,例如:

    s := "你好"
    println(s[1:3]) // ��

s[m:n] 用法从第m个字节处开始截取,返回的字串长度为 n-m 字节。若省略 m 则表示从字符串开始截取,若省略 n 则表示截取至字符串末尾,例如:

    s := "abcdefg"
    println(s[:3]) // abc
    println(s[3:]) // defg

从底层数据的角度看,截取子字符串时没有重新申请字节数组拷贝,而是直接引用原始字符串的地址。为避免多个引用同一片内存的字符串相互修改的影响,字符串被设定为不能局部修改——既不能向 s[n] 赋值。下述写法是非法的:

    s := "abcdefg"
    s[0] = 99 // 非法操作

两个字符串间可使用 ==!= 运算符进行相等、不等判断,例如:

    s := "abc"
    println(s == "123") // false
    println(s != "123") // true

内建函数 len 可用于获取字符串长度(以字节为单位),如:

    s := "abcdefg"
    println(len(s)) // 7

已知问题列表:

  • 使用 [] 获取字符串变量的指定字节或子串时,未执行边界检查。该问题不影响语法兼容性,后续对本问题的修正不影响已有源代码,凹程序开发者无须对此进行特别处理。