Go 语言字符串(String)

在Go语言中,字符串不同于其他语言,如Java、c++、Python等。它是一个变宽字符序列,其中每个字符都用UTF-8编码的一个或多个字节表示。或者换句话说,字符串是任意字节(包括值为零的字节)的不可变链,或者字符串是一个只读字节片,字符串的字节可以使用UTF-8编码在Unicode文本中表示。

由于采用UTF-8编码,Golang字符串可以包含文本,文本是世界上任何语言的混合,而不会造成页面的混乱和限制。通常,字符串用双引号””引起来,如以下示例所示:

//如何创建字符串
package main 
  
import "fmt"
  
func main() { 
  
//创建并初始化
//带有字符串的变量
//使用简写声明
    My_value_1 := "Welcome to (cainiaoplus.com)"
  
    //使用var关键字
    var My_value_2 string 
    My_value_2 = "nhooo"
  
    //显示字符串 
    fmt.Println("String 1: ", My_value_1) 
    fmt.Println("String 2: ", My_value_2) 
}

输出:

String 1:  Welcome to (cainiaoplus.com)
String 2:  nhooo

注意:字符串可以为空,但不能为nil。

字符串字面量

在Go语言中,字符串字面量是通过两种不同的方式创建的:

  • 使用双引号(“”):在这里,字符串字面量使用双引号(“”)创建。此类字符串支持转义字符,如下表所示,但不跨越多行。这种类型的字符串文字在Golang程序中被广泛使用。

    转义符描述
    \\反斜杠(\)
    \000具有给定的3位8位八进制代码点的Unicode字符
    \’单引号(')。仅允许在字符文字中使用
    \”双引号("")。仅允许在解释的字符串文字中使用
    \aASCII铃声(BEL)
    \bASCII退格键(BS)
    \fASCII换页(FF)
    \nASCII换行符(LF)
    \rASCII回车(CR)
    \tASCII标签(TAB)
    \uhhhh具有给定的4位16位十六进制代码点的Unicode字符。

    具有给定的8位32位十六进制代码点的Unicode字符。
    \vASCII垂直制表符(VT)
    \xhh具有给定的2位8位十六进制代码点的Unicode字符。
  • 使用反引号(``):此处,字符串文字是使用反引号(``)创建的,也称为raw literals(原始文本)。原始文本不支持转义字符,可以跨越多行,并且可以包含除反引号之外的任何字符。通常,它用于在正则表达式和HTML中编写多行消息。

    package main
    
    import "fmt"
    
    func main() {
    
        //创建并初始化
        //带有字符串文字的变量
        //使用双引号
        My_value_1 := "Welcome to nhooo"
    
        //添加转义字符
        My_value_2 := "Welcome!\nnhooo"
    
        //使用反引号
        My_value_3 := `Hello!nhooo`
    
        //添加转义字符
    
        //原始文本
        My_value_4 := `Hello!\nnhooo`
    
        //显示
        fmt.Println("String 1: ", My_value_1)
        fmt.Println("String 2: ", My_value_2)
        fmt.Println("String 3: ", My_value_3)
        fmt.Println("String 4: ", My_value_4)
    }

    输出:

    String 1:  Welcome to nhooo
    String 2:  Welcome!
    nhooo
    String 3:  Hello!nhooo
    String 4:  Hello!\nnhooo

关于字符串的要点

  • 字符串是不可变的:在Go语言中,一旦创建了字符串,则字符串是不可变的,无法更改字符串的值。换句话说,字符串是只读的。如果尝试更改,则编译器将引发错误。

    //字符串是不可变的
    package main 
      
    import "fmt"
      
    func main() { 
      
            //创建和初始化字符串
            //使用简写声明
        mystr := "Welcome to nhooo"
      
        fmt.Println("String:", mystr) 
      
        /* 果你试图改变字符串的值,编译器将抛出一个错误,例如, 
         cannot assign to mystr[1] 
           mystr[1]= 'G' 
           fmt.Println("String:", mystr) 
        */
      
    }

    输出:

    String: Welcome to nhooo
  • 如何遍历字符串?:您可以使用for range循环遍历字符串。此循环可以在Unicode代码点上迭代一个字符串。

    语法:

    for index, chr:= range str{
         // 语句..
    }

    在这里,索引是存储UTF-8编码代码点的第一个字节的变量,而chr是存储给定字符串的字符的变量,str是字符串。

    //遍历字符串
    //使用for范围循环
    package main
    
    import "fmt"
    
    func main() {
    
        //字符串作为for循环中的范围
        for index, s := range "nhooo" {
    
            fmt.Printf("%c 索引值是 %d\n", s, index)
        }
    }

    输出:

    n 索引值是 0
    h 索引值是 1
    o 索引值是 2
    o 索引值是 3
    o 索引值是 4
  • 如何访问字符串的单个字节?:字符串是一个字节,因此,我们可以访问给定字符串的每个字节。

    //访问字符串的字节
    package main
    
    import "fmt"
    
    func main() {
    
        //创建和初始化一个字符串
        str := "Welcome to nhooo"
    
        //访问给定字符串的字节
        for c := 0; c < len(str); c++ {
    
            fmt.Printf("\n字符 = %c 字节 = %v", str[c], str[c])
        }
    }

    输出:

    字符 = W 字节 = 87
    字符 = e 字节 = 101
    字符 = l 字节 = 108
    字符 = c 字节 = 99
    字符 = o 字节 = 111
    字符 = m 字节 = 109
    字符 = e 字节 = 101
    字符 =   字节 = 32
    字符 = t 字节 = 116
    字符 = o 字节 = 111
    字符 =   字节 = 32
    字符 = n 字节 = 110
    字符 = h 字节 = 104
    字符 = o 字节 = 111
    字符 = o 字节 = 111
    字符 = o 字节 = 111
  • 如何从切片创建字符串?:在Go语言中,允许您从字节切片创建字符串。

    //从切片创建一个字符串 
    package main 
      
    import "fmt"
      
    func main() { 
      
        //创建和初始化一个字节片
        myslice1 := []byte{0x47, 0x65, 0x65, 0x6b, 0x73} 
      
        //从切片创建字符串
        mystring1 := string(myslice1) 
      
        //显示字符串
        fmt.Println("String 1: ", mystring1) 
      
        //创建和初始化一个符文切片 
        myslice2 := []rune{0x0047, 0x0065, 0x0065, 0x006b, 0x0073} 
      
        //从切片创建字符串
        mystring2 := string(myslice2) 
      
        //显示字符串
        fmt.Println("String 2: ", mystring2) 
    }

    输出:

    String 1:  Geeks
    String 2:  Geeks
  • 如何查找字符串的长度?:在Golang字符串中,可以使用两个函数(一个是len(),另一个是RuneCountInString())来找到字符串的长度。UTF-8包提供了RuneCountInString()函数,该函数返回字符串中存在的符文总数。len()函数返回字符串的字节数。

    //查找字符串的长度
    package main
    
    import (
        "fmt"
        "unicode/utf8"
    )
    
    func main() {
    
        //创建和初始化字符串
        //使用简写声明
        mystr := "Welcome to nhooo ??????"
    
        //查找字符串的长度
        //使用len()函数
        length1 := len(mystr)
    
        //使用RuneCountInString()函数
        length2 := utf8.RuneCountInString(mystr)
    
        //显示字符串的长度
        fmt.Println("string:", mystr)
        fmt.Println("Length 1:", length1)
        fmt.Println("Length 2:", length2)
    
    }

    输出:

    string: Welcome to nhooo ??????
    Length 1: 31
    Length 2: 31