新聞中心
一個字符串是一個不可改變的字節(jié)序列,字符串可以包含任意的數(shù)據(jù),但是通常是用來包含可讀的文本,字符串是 UTF-8 字符的一個序列(當字符為 ASCII 碼表上的字符時則占用 1 個字節(jié),其它字符根據(jù)需要占用 2-4 個字節(jié))。

成都創(chuàng)新互聯(lián)公司2013年成立,先為河間等服務(wù)建站,河間等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為河間企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
UTF-8 是一種被廣泛使用的編碼格式,是文本文件的標準編碼,其中包括 XML 和 JSON 在內(nèi)也都使用該編碼。由于該編碼對占用字節(jié)長度的不定性,在Go語言中字符串也可能根據(jù)需要占用 1 至 4 個字節(jié),這與其它編程語言如 C++、 Java 或者 Python 不同(Java 始終使用 2 個字節(jié))。Go語言這樣做不僅減少了內(nèi)存和硬盤空間占用,同時也不用像其它語言那樣需要對使用 UTF-8 字符集的文本進行編碼和解碼。
字符串是一種值類型,且值不可變,即創(chuàng)建某個文本后將無法再次修改這個文本的內(nèi)容,更深入地講,字符串是字節(jié)的定長數(shù)組。
定義字符串
可以使用雙引號""來定義字符串,字符串中可以使用轉(zhuǎn)義字符來實現(xiàn)換行、縮進等效果,常用的轉(zhuǎn)義字符包括:
- \n:換行符
- \r:回車符
- \t:tab 鍵
- \u 或 \U:Unicode 字符
- \\:反斜杠自身
package main
import (
"fmt"
)
func main() {
var str = "C語言中文網(wǎng)\nGo語言教程"
fmt.Println(str)
}運行結(jié)果為:
C語言中文網(wǎng)
Go語言教程
一般的比較運算符(==、!=、<、<=、>=、>)是通過在內(nèi)存中按字節(jié)比較來實現(xiàn)字符串比較的,因此比較的結(jié)果是字符串自然編碼的順序。字符串所占的字節(jié)長度可以通過函數(shù) len() 來獲取,例如 len(str)。
字符串的內(nèi)容(純字節(jié))可以通過標準索引法來獲取,在方括號[ ]內(nèi)寫入索引,索引從 0 開始計數(shù):
- 字符串 str 的第 1 個字節(jié):str[0]
- 第 i 個字節(jié):str[i - 1]
- 最后 1 個字節(jié):str[len(str)-1]
需要注意的是,這種轉(zhuǎn)換方案只對純 ASCII 碼的字符串有效。
注意:獲取字符串中某個字節(jié)的地址屬于非法行為,例如 &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!”
字符串實現(xiàn)基于 UTF-8 編碼
Go語言中字符串的內(nèi)部實現(xiàn)使用 UTF-8 編碼,通過 rune 類型,可以方便地對每個 UTF-8 字符進行訪問。當然,Go語言也支持按照傳統(tǒng)的 ASCII 碼方式逐字符進行訪問。
關(guān)于字符串的 UTF-8 字符訪問的詳細方法,后面的章節(jié)將會詳細介紹。
定義多行字符串
在Go語言中,使用雙引號書寫字符串的方式是字符串常見表達方式之一,被稱為
字符串字面量(string literal),這種雙引號字面量不能跨行,如果想要在源碼中嵌入一個多行字符串時,就必須使用`反引號,代碼如下:
const str = `第一行 第二行 第三行 \r\n ` fmt.Println(str)
代碼運行結(jié)果:
第一行
第二行
第三行
\r\n
反引號`,是鍵盤上 1 鍵左邊的鍵,兩個反引號間的字符串將被原樣賦值到 str 變量中。
在這種方式下,反引號間換行將被作為字符串中的換行,但是所有的轉(zhuǎn)義字符均無效,文本將會原樣輸出。
多行字符串一般用于內(nèi)嵌源碼和內(nèi)嵌數(shù)據(jù)等,代碼如下:
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,類型為字符串,使用`定義,字符串的內(nèi)容為一段代碼生成中使用到的 Go 源碼格式。
在`間的所有代碼均不會被編譯器識別,而只是作為字符串的一部分。
字符串類型在業(yè)務(wù)中的應(yīng)用可以說是最廣泛的,讀者需要詳細了解字符串的常見用法,請猛擊下面的文章:
- Go語言計算字符串長度——len()和RuneCountInString()
- Go語言遍歷字符串——獲取每一個字符串元素
- Go語言字符串截取(獲取字符串的某一段字符)
- Go語言修改字符串
- Go語言字符串拼接(連接)
- Go語言fmt.Sprintf(格式化輸出)
- Go語言Base64編碼——電子郵件的基礎(chǔ)編碼格式
當前名稱:創(chuàng)新互聯(lián)GO教程:Go語言字符串
本文路徑:http://www.dlmjj.cn/article/dpsphjd.html


咨詢
建站咨詢
