首頁 >後端開發 >Golang >go語言中str是什麼意思

go語言中str是什麼意思

青灯夜游
青灯夜游原創
2022-12-27 12:59:154332瀏覽

在go語言中,str指的是“字串”,是一個不可改變的位元組序列。字串可以包含任意的數據,但是通常是用來包含可讀的文本,字串是UTF-8 字元的一個序列(當字元為ASCII 碼表上的字元時則佔用1 個字節,其它字元根據需要佔用2-4 個位元組)。字串是一種值類型,且值不可變,也就是創建某個文字後將無法再次修改這個文字的內容,更深入地講,字串是位元組的定長數組。

go語言中str是什麼意思

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

在go語言中,str指的是「字串」。

一個字串是一個不可改變的位元組序列,字串可以包含任意的數據,但是通常是用來包含可讀的文本,字串是UTF-8 字元的一個序列(當字元為ASCII 碼表上的字元時則佔用1 個位元組,其它字元根據需要佔用2-4 個位元組)。

Go語言中字串的內部實作使用 UTF-8 編碼,透過 rune 類型,可以方便地對每個 UTF-8 字元進行存取。當然,Go語言也支援以傳統的 ASCII 碼方式逐字元進行存取。

UTF-8 是一種被廣泛使用的編碼格式,是文字檔案的標準編碼,其中包括 XML 和 JSON 在內也都使用該編碼。由於該編碼對佔用位元組長度的不定性,在Go語言中字串也可能根據需要佔用1 至4 個位元組,這與其它程式語言如C 、Java 或Python 不同(Java 始終使用2 個位元組)。 Go語言這樣做不僅減少了記憶體和硬碟空間佔用,同時也不用像其它語言那樣需要對使用 UTF-8 字元集的文字進行編碼和解碼。

字串是一種值類型,且值不可變,也就是創建某個文字後將無法再次修改這個文字的內容,更深入地講,字串是位元組的定長數組。

定義字串

可以使用雙引號""來定義字串,字串中可以使用轉義字元來實現換行、縮排等效果,常用的轉義字元包括:

  • \n:換行符

  • \r:回車符號

  • \t:tab 鍵

  • \u 或\U:Unicode 字元

  • \\:反斜線本身

package main
import (
    "fmt"
)
func main() {
    var str = "PHP中文网\nGo语言教程"
    fmt.Println(str)
}

執行結果為:

go語言中str是什麼意思

一般的比較運算子(==、!=、=、>)是透過在記憶體中以位元組比較來實現字串比較的,因此比較的結果是字串自然編碼的順序。字串所佔的位元組長度可以透過函數 len() 來獲取,例如 len(str)。

字串的內容(純位元組)可以透過標準索引法來取得,在方括號[ ]內寫入索引,索引從0 開始計數:

  • 字串str 的第1 個位元組:str[0]

  • 第i 個位元組:str[i - 1]

  • 最後1 個位元組:str[len(str)-1]

要注意的是,這種轉換方案只對純ASCII 碼的字串有效。

注意:取得字串中某個位元組的位址屬於非法行為,例如 &str[i]

字串拼接符「 」

#兩個字串s1 和s2 可以透過s := s1 s2 拼接在一起。將 s2 追加到 s1 尾部並產生一個新的字串 s。

可以透過下面的方式來對程式碼中多行的字串進行拼接:

str := "Beginning of the string " +
"second part of the string"

提示:因為編譯器會在行尾自動補全分號,所以拼接字串用的加號“ ”必須放在第一行末尾。

也可以使用「 =」來對字串進行拼接:

s := "hel" + "lo,"
s += "world!"
fmt.Println(s) //输出 “hello, world!”

#定義多行字串

在Go語言中,使用雙引號書寫字串的方式是字串常見表達方式之一,被稱為字串字面量(string literal),這種雙引號字面量不能跨行,如果想要在原始碼中嵌入一個多行字串時,就必須使用`反引號,程式碼如下:

const str = `第一行
第二行
第三行
\r\n
`
fmt.Println(str)

程式碼運行結果:

go語言中str是什麼意思

# #反引號

`,是鍵盤上1 鍵左邊的鍵,兩個反引號間的字串將會被原樣賦值到str 變數中。

在這種方式下,反引號間換行將被當作字串中的換行,但是所有的轉義字元都無效,文字將會原樣輸出。

多行字串一般用於內嵌原始碼和內嵌資料等,程式碼如下:

const codeTemplate = `// Generated by github.com/davyxu/cellnet/
protoc-gen-msg
// DO NOT EDIT!{{range .Protos}}
// Source: {{.Name}}{{end}}
package {{.PackageName}}
{{if gt .TotalMessages 0}}
import (
    "github.com/davyxu/cellnet"
    "reflect"
    _ "github.com/davyxu/cellnet/codec/pb"
)
{{end}}
func init() {
    {{range .Protos}}
    // {{.Name}}{{range .Messages}}
    cellnet.RegisterMessageMeta("pb","{{.FullName}}", reflect.TypeOf((*{{.Name}})(nil)).Elem(), {{.MsgID}})    {{end}}
    {{end}}
}

这段代码只定义了一个常量 codeTemplate,类型为字符串,使用`定义,字符串的内容为一段代码生成中使用到的 Go 源码格式。

`间的所有代码均不会被编译器识别,而只是作为字符串的一部分。

字符串字面量

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

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

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

具有给定的8位32位十六进制代码点的Unicode字符。
\v ASCII垂直制表符(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)
}

输出:

go語言中str是什麼意思

关于字符串的要点

  • 字符串是不可变的:在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) 
    */
  
}

输出:

go語言中str是什麼意思

  • 如何遍历字符串?:您可以使用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)
    }
}

输出:

go語言中str是什麼意思

  • 如何访问字符串的单个字节?:字符串是一个字节,因此,我们可以访问给定字符串的每个字节。

//访问字符串的字节
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])
    }
}

go語言中str是什麼意思

  • 如何从切片创建字符串?:在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) 
}

go語言中str是什麼意思

  • 如何查找字符串的长度?:在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)

}

go語言中str是什麼意思

【相关推荐:Go视频教程编程教学

以上是go語言中str是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn