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

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


咨詢
建站咨詢
