开发者社区> 游客bizckxyrg6t5g> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
字符串的基本操作
String类的概述 String类的构造方法 String类的判断功能 String类的获取功能 String类的转换功能 String其他类型互转汇总 其它类型转成String类型 String类型转成其它类型 StringStringBuffer与Stri...
1357 0
遍历字符串
首先必须要知道,Java字符串不是char数组而是Unicode序列,这是很多C/C++程序员转Java时会遇到的坑 为什么Java要用Unicode编码机制来定义String中的字符单元呢?...
1012 0
字符串
你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- 第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释; 第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
700 0
c#字符串操作方法实例
# 字符串是使用 string 关键字声明的一个字符数组。字符串是使用引号声明的,如下例所示: string s = "Hello, World!"; 字符串对象是“不可变的”,即它们一旦创建就无法更改。
892 0
串操作
一、串定义 串(或字符串),是由零个或多个字符组成的有限序列。一般记为: s='a1a2...an'(n>=0) 其中s是串的名,用单引号括起来的字符序列是串的值;串中字符的数目n称为串的长度。
652 0
81
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载