Go 字符串操作

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 字符串操作相关的知识,希望对你有一定的参考价值。

文章目录


简介

字符串是不可变值类型,内部用指针指向 UTF-8 字节数组。

  • 默认值是空字符串 “”。
  • 用索引号访问某字节,如 s[i]。
  • 不能用序号获取字节元素指针,&s[i] 非法。
  • 不可变类型,无法修改字节数组。
  • 字节数组尾部不包含 NULL。

使用索引号访问字符 (byte)

package main
func main() 
    s := "abc"
    println(s[0] == '\\x61', s[1] == 'b', s[2] == 0x63)

输出结果:

true true true

使用 “ ` “ 定义不做转义处理的原始字符串,支持跨行

package main
func main() 
    s := `a
b\\r\\n\\x00
c`
    println(s)

输出结果:

a
b\\r\\n\\x00
c

跨行拼接字符串

连接跨行字符串时,”+” 必须在上一行末尾,否则导致编译错误

package main
import (
    "fmt"
)
func main() 
    s := "Hello, " +
        "World!"
    // s2 := "Hello, "
    // +"World!" 
    //./main.go:11:2: invalid operation: + untyped string
    fmt.Println(s)

输出结果:

Hello, World!

子串切片

串依然指向原字节数组,仅修改了指针和度属性。

package main
import (
    "fmt"
)
func main() 
    s := "Hello, World!"
    s1 := s[:5]  // Hello
    s2 := s[7:]  // World!
    s3 := s[1:5] // ello
    fmt.Println(s, s1, s2, s3)

输出结果:

Hello, World! Hello World! ello

修改字符串

是说了不能直接修改,但是没说不能修改呀?!!

要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。

package main
func main() 
    s := "abcd"
    bs := []byte(s)
    bs[1] = 'B'
    println(string(bs))
    u := "电脑"
    us := []rune(u)
    us[1] = '话'
    println(string(us))

输出结果:

aBcd
电话

遍历字符串

for 循环遍历字符串时,也有 byte 和 rune 两种方式

package main
import (
    "fmt"
)
func main() 
    s := "abc汉字"
    for i := 0; i < len(s); i++  // byte
        fmt.Printf("%c,", s[i])
    
    fmt.Println()
    for _, r := range s  // rune
        fmt.Printf("%c,", r)
    
    fmt.Println()

输出结果:

a,b,c,æ,±,,å,­,,
a,b,c,,,

字符串替换

package main
import (
    "fmt"
    "strings"
)
func main() 
    str := "hello world world"
    res0 := strings.Replace(str, "world", "golang", 2)
    res1 := strings.Replace(str, "world", "golang", 1)
    //trings.Replace("原字符串", "被替换的内容", "替换的内容", 替换次数)
    fmt.Printf("res0 is %v\\n", res0)
    fmt.Printf("res1 is %v\\n", res1)

输出结果:

res0 is hello golang golang

res1 is hello golang world

切割/合并 字符串

package main

import (
	"strings"

	"fmt"
)

func main() 

	// 按照指定字符串切割原字符串

	// 用,切割字符串

	arr1 := strings.Split("a,b,c", ",")

	fmt.Println(arr1) // [a b c]

	arr2 := strings.Split("ambmc", "m")

	fmt.Println(arr2) // [a b c]

	// 按照指定字符串切割原字符串, 并且指定切割为几份

	// 如果最后一个参数为0, 那么会范围一个空数组

	arr3 := strings.SplitN("a,b,c", ",", 2)

	fmt.Println(arr3) // [a b,c]

	arr4 := strings.SplitN("a,b,c", ",", 0)

	fmt.Println(arr4) // []

	// 按照指定字符串切割原字符串, 切割时包含指定字符串

	arr5 := strings.SplitAfter("a,b,c", ",")

	fmt.Println(arr5) // [a, b, c]

	// 按照指定字符串切割原字符串, 切割时包含指定字符串, 并且指定切割为几份

	arr6 := strings.SplitAfterN("a,b,c", ",", 2)

	fmt.Println(arr6) // [a, b,c]

	// 按照空格切割字符串, 多个空格会合并为一个空格处理

	arr7 := strings.Fields("a  b c    d")

	fmt.Println(arr7) // [a b c d]

	// 将字符串转换成切片传递给函数之后由函数决定如何切割

	// 类似于IndexFunc

	arr8 := strings.FieldsFunc("a,b,c", custom)

	fmt.Println(arr8) // [a b c]

	// 将字符串切片按照指定连接符号转换为字符串

	sce := []string"aa", "bb", "cc"

	str1 := strings.Join(sce, "-")

	fmt.Println(str1) // aa-bb-cc

	// 返回count个s串联的指定字符串

	str2 := strings.Repeat("abc", 2)

	fmt.Println(str2) // abcabc

	// 第一个参数: 需要替换的字符串

	// 第二个参数: 旧字符串

	// 第三个参数: 新字符串

	// 第四个参数: 用新字符串 替换 多少个旧字符串

	// 注意点: 传入-1代表只要有旧字符串就替换

	// 注意点: 替换之后会生成新字符串, 原字符串不会受到影响

	str3 := "abcdefabcdefabc"

	str4 := strings.Replace(str3, "abc", "mmm", -1)

	fmt.Println(str3) // abcdefabcdefabc

	fmt.Println(str4) // mmmdefmmmdefmmm



func custom(r rune) bool 

	fmt.Printf("被调用了, 当前传入的是%c\\n", r)

	if r == ',' 

		return true

	

	return false


以上是关于Go 字符串操作的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个旧的依赖会使我的 gradle 崩溃?

Go字符串操作技巧

Go:字符串操作

这个旧的 C 编译器中的 ossiz 是啥?

go 字符串操作

Go 中的字符串相关操作