基本性质
- GO的字符串都是UTF-8编码
- 长度不固定,字符为 ASCII 码时占用1字节,其它字符占用2-4字节
- C++,Java等语言都是占据固定长度
- 好处是不仅减少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码
- 字符串不可变
string[0] = 'a'
编译错误- 只能先转换为
[]byte
再转换回去,或者使用strings.Replace
函数
- 获取字符串中某个字节的地址的行为是非法的
- ""包裹的字符串会自动转义(如\n, \r), ``包裹的字符串会原样输出
- 所以json字符串都是用反引号包裹
- 字符串拼接
- 最简单的方式时使用重载的+运算符
- 在循环中使用加号 + 拼接字符串并不是最高效的做法,更好的办法是使用函数 strings.Join
- 更好的方式是使用字节缓冲(bytes.Buffer)拼接
var buffer bytes.Buffer
for {
if s, ok := getNextString(); ok {
buffer.WriteString(s)
} else {
break
}
}
fmt.Print(buffer.String(), "\n")
strings包
strings.HasPrefix(s, sub) bool
strings.HasSuffix(s, sub) bool
strings.Contains(s, sub) bool
strings.Index(s, sub) int // 返回-1表示找不到
strings.LastIndex(s, sub) int
strings.Replace(str, old, new, n) string // n为-1则替换所有old
strings.Count(s, sub) int
strings.Repeat(s, n) string // 重复n次字符串s,返回新字符串
strings.ToLower(s) string
strings.ToUpper(s) string
strings.TrimSpace(s) string// 剔除空白符
strings.Trim(s, cutset) string
strings.Feilds(s) []string //去除s字符串的空格符
strings.Split(s, sep) []string // 自定义分隔符sep
strings.Join(sl []string, sep string) string // 合并字符串
strconv包
strconv.Itoa(i int) string
strconv.Atoi(s string) (i int, err error)
// fmt表示格式('b'、'e'、'f'、'g');prec表示精度;bitSize用32表示float32,用64表示float64
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
strconv.ParseFloat(s string, bitSize int) (f float64, err error)
// 将bool等类型转换为字符串后,添加到现有的字节数组中
strconv.AppendBool(dst []byte, b bool) []byte
正则匹配
//目标字符串
searchIn := "John: 2578.34 William: 4567.23 Steve: 5632.18"
pat := "[0-9]+.[0-9]+" //正则
f := func(s string) string{
v, _ := strconv.ParseFloat(s, 32)
return strconv.FormatFloat(v * 2, 'f', 2, 32)
}
if ok, _ := regexp.Match(pat, []byte(searchIn)); ok {
fmt.Println("Match Found!")
}
re, _ := regexp.Compile(pat)
//将匹配到的部分替换为"##.#"
str := re.ReplaceAllString(searchIn, "##.#")
fmt.Println(str)
//参数为函数时
str2 := re.ReplaceAllStringFunc(searchIn, f)
fmt.Println(str2)
输出
Match Found!
John: ##.# William: ##.# Steve: ##.#
John: 5156.68 William: 9134.46 Steve: 11264.36