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