Golang字符串函数用法

字符串介绍

几乎任何程序都离不开字符串,字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。

Go语言字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲,字符串是字节的定长数组。

Go 代码使用 UTF-8 编码(且不能带 BOM),同时标识符支持 Unicode 字符。在标准库 unicode 包及其子包 utf8、utf16中,提供了对 Unicode 相关编码、解码的支持,同时提供了测试 Unicode 码点(Unicode code points)属性的功能。

Go语言中的字符串也可能根据需要占用 1至 4 个字节,这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字节)。Go 这样做的好处是不仅减少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。

Go语言支持以下2种形式的字符串:
1. 解释性字符串:带引号的字节序列。该类字符串使用双引号括起来,其中的相关的转义字符将被替换。例如:

str := "laoYu"
  1. 原生字符串: 该类字符串使用反引号(注意:不是单引号)括起来,支持换行。例如:
`This is a raw string \n` 

上面原生字符串中的 \n 会被原样输出。

获取字符串长度可以用内置的函数len。

字符串函数包

strings 包提供了很多操作字符串的简单函数,通常一般的字符串操作需求都可以在这个包中找到。

下面简单举几个例子:

  • 判断是否以某字符串打头/结尾

    strings.HasPrefix(s, prefix string) bool
    strings.HasSuffix(s string, suffix string) bool

  • 字符串分割

    strings.Split(s string, sep string) []string

  • 返回子串索引

    strings.Index(s string, sub string) int
    strings.LastIndex 最后一个匹配索引

  • 字符串连接

    strings.Join(a []string, sep string) string

  • 字符串替换

    strings.Replace(s, old, new string, n int) string

  • 字符串转化为大小写

    strings.ToUpper(s string) string
    strings.ToLower(s string) string

  • 统计某个字符在字符串出现的次数

    strings.Count(s string, sep string) int

  • 判断字符串的包含关系

    strings.Contains(s, substr string) bool

strconv 包提供了基本数据类型和字符串之间的转换。在 Go 中,没有隐式类型转换,一般的类型转换可以这么做:int32(i),将 i (比如为 int 类型)转换为 int32,然而,字符串类型和 int、float、bool 等类型之间的转换却没有这么简单。

与字符串相关的类型转换都是通过 strconv 包实现的。

针对从数字类型转换到字符串,Go 提供了以下函数:

  • strconv.Itoa(i int) string

    返回数字 i 所表示的字符串类型的十进制数。

代码示例

下面我们示范下上述函数的简单使用:

package main

import(
  "fmt"
  "strings"
  "strconv"
)

  func main() {
    str01 :=`This is a raw string \n`  //原生字符串
    str02 :="This is a raw string \n"//引用字符串
    fmt.Println("原生字符串和引用字符串的区别")
    fmt.Printf(str01)
    fmt.Println("")
    fmt.Printf(str02)
    fmt.Println("")

    fmt.Println("+连接字符串")
    var str03 string = str01 +str02
    fmt.Printf(str03)
    fmt.Println("")
    var str string = "This is an example of a string"

    fmt.Println("HasPrefix 函数的用法")
    fmt.Printf("T/F? Does the string \"%s\"have prefix %s? ", str, "Th") //前缀
    fmt.Printf("%t\n", strings.HasPrefix(str, "Th\n"))
    fmt.Println("")
    fmt.Println("Contains 函数的用法")
    fmt.Println(strings.Contains("seafood", "foo")) //true
    fmt.Println(strings.Contains("seafood", "bar")) //false

    fmt.Println("Count 函数的用法")
    fmt.Println(strings.Count("cheese", "e")) // 3
    fmt.Println(strings.Count("five", ""))    // before & after each rune result: 5 , 源码中有实现
    fmt.Println("")
    fmt.Println("Index 函数的用法")
    fmt.Println(strings.IndexRune("NLT_abc", 'b')) // 返回第一个匹配字符的位置,这里是4
    fmt.Println(strings.IndexRune("NLT_abc", 's')) // 在存在返回 -1
    fmt.Println(strings.IndexRune("我是中国人", '中'))   // 在存在返回 6

    fmt.Println("")
    fmt.Println("Join 函数的用法")
    s := []string{"foo", "bar", "baz"}
    fmt.Println(strings.Join(s, ", ")) // 返回字符串:foo, bar, baz

    fmt.Println("")
    fmt.Println("LastIndex 函数的用法")
    fmt.Println(strings.LastIndex("go gopher", "go")) // 3

    fmt.Println("")
    fmt.Println("Replace 函数的用法")
    fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
    fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))

    fmt.Println("")
    fmt.Println("Split 函数的用法")
    fmt.Printf("%q\n", strings.Split("a,b,c", ","))
    fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
    fmt.Printf("%q\n", strings.Split(" xyz ", ""))
    fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))

    fmt.Println("")
    fmt.Println("ToLower 函数的用法")
    fmt.Println(strings.ToLower("Gopher")) //gopher
    fmt.Println("")


    fmt.Println("strconv.Itoa()函数用法")
    var an int = 6
    newS := strconv.Itoa(an)
    fmt.Printf("The new string is: %s\n", newS)
}

你可能感兴趣的:(golang)