C語言中文網 目錄

Go語言字符串

字符串在 Go 語言中以原生數據類型出現,使用字符串就像使用其他原生數據類型(int、bool、float32、float64 等)一樣。

提示:在 C++C# 語言中,字符串以類的方式進行封裝。

C# 語言中在使用泛型匹配約束類型時,字符串是以 Class 的方式存在,而不是 String,因為并沒有“字符串”這種原生數據類型。

在 C++ 語言中使用模板匹配類型時,為了使字符串與其他原生數據類型一樣支持賦值操作,需要對字符串類進行操作符重載。

字符串的值為雙引號中的內容,可以在 Go 語言的源碼中直接添加非 ASCII 碼字符,代碼如下:
str := "hello world"
ch := "中文"

字符串轉義符

Go 語言的字符串常見轉義符包含回車、換行、單雙引號、制表符等,如下表所示。

Go語言的常見轉義符
轉移符 含  義
\r 回車符(返回行首)
\n 換行符(直接跳到下一行的同列位置)
\t 制表符
\' 單引號
\" 雙引號
\\ 反斜杠

在 Go 語言源碼中使用轉義符代碼如下:
package main

import (
    "fmt"
)

func main() {
    fmt.Println("str := \"c:\\Go\\bin\\go.exe\"")
}
代碼運行結果:

str := "c:\Go\bin\go.exe"

這段代碼中將雙引號和反斜杠“\”進行轉義。

字符串實現基于 UTF-8 編碼

Go 語言里的字符串的內部實現使用 UTF-8 編碼。通過 rune 類型,可以方便地對每個 UTF-8 字符進行訪問。當然,Go 語言也支持按傳統的 ASCII 碼方式進行逐字符訪問。

提示:Python 語言的 2.0 版本不是基于 UTF-8 編碼設計,到了 3.0 版才改為 UTF-8 編碼設計。因此,使用 2.0 版本時,在編碼上會出現很多混亂情況。

同樣,C/C++語言的 std::string 在使用 UTF-8 時,經常因為沒有方便的 UTF-8 配套封裝讓編寫極為困難。

關于字符串的 UTF-8 字符訪問的詳細方法,后面的章節將會詳細介紹。

定義多行字符串

在源碼中,將字符串的值以雙引號書寫的方式是字符串的常見表達方式,被稱為字符串字面量(string literal)。這種雙引號字面量不能跨行。如果需要在源碼中嵌入一個多行字符串時,就必須使用`字符,代碼如下:
const str = ` 第一行
第二行
第三行
\r\n
`
fmt.Println(str)
代碼運行結果:

第一行
第二行
第三行
\r\n


`叫反引號,就是鍵盤上 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 源碼格式。

`間的所有代碼均不會被編譯器識別,而只是作為字符串的一部分。

字符串類型在業務中的應用可以說是最廣泛的,讀者需要詳細了解字符串的常見用法,請猛擊下面的文章:

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo