Go 字符串操作

简介:

@[toc]
在这里插入图片描述

简介

字符串是不可变值类型,内部用指针指向 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

}
相关文章
|
5月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
53 6
|
5月前
|
并行计算 Go C++
2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
【2月更文挑战第19天】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
43 1
|
5月前
|
安全 Java 编译器
Go 字符串拼接方式
Go 字符串拼接方式
49 0
|
11月前
|
Go
go string to int 字符串与整数型的互换
go string to int 字符串与整数型的互换
54 0
|
5月前
|
供应链 Go C语言
掌握Go语言:探索Go语言基础,字符串连接、关键字、空格、格式化字符串的重要性(7)
掌握Go语言:探索Go语言基础,字符串连接、关键字、空格、格式化字符串的重要性(7)
|
10天前
|
Go
Go字节数组与字符串相互转换
Go字节数组与字符串相互转换
24 3
|
8天前
|
存储 Go
go语言字符串变小写
go语言字符串变小写
|
2月前
|
Go 开发者
|
2月前
|
JSON Go 数据格式
Go实现json字符串与各类struct相互转换
文章通过Go语言示例代码详细演示了如何实现JSON字符串与各类struct之间的相互转换,包括结构体对象生成JSON字符串和JSON字符串映射到struct对象的过程。
15 0
|
4月前
|
Go
【golang】Go 判断字符串是否包含指定字符
【golang】Go 判断字符串是否包含指定字符
54 1
下一篇
无影云桌面