真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言中的單引號 go語言引用

Go語言中的結(jié)構(gòu)體

作為C語言家族的一員,go和c一樣也支持結(jié)構(gòu)體??梢灶惐扔趈ava的一個POJO。

佳縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)

在學(xué)習(xí)定義結(jié)構(gòu)體之前,先學(xué)習(xí)下定義一個新類型。

新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。

這里要引入一個底層類型的概念。

如果一個新類型是基于某個 Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型

在上面的例子中,int就是T1的底層類型。

但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int

底層類型是很重要的,因為對兩個變量進(jìn)行顯式的類型轉(zhuǎn)換,只有底層類型相同的變量間才能相互轉(zhuǎn)換。底層類型是判斷兩個類型本質(zhì)上是否相同的根本。

這種類型定義方式通常用在 項目的漸進(jìn)式重構(gòu),還有對已有包的二次封裝方面

類型別名表示新類型和原類型完全等價,實際上就是同一種類型。只不過名字不同而已。

一般我們都是定義一個有名的結(jié)構(gòu)體。

字段名的大小寫決定了字段是否包外可用。只有大寫的字段可以被包外引用。

還有一個點提一下

如果換行來寫

Age: 66,后面這個都好不能省略

還有一個點,觀察e3的賦值

new返回的是一個指針。然后指針可以直接點號賦值。這說明go默認(rèn)進(jìn)行了取值操作

e3.Age 等價于 (*e3).Age

如上定義了一個空的結(jié)構(gòu)體Empty。打印了元素e的內(nèi)存大小是0。

有什么用呢?

基于空結(jié)構(gòu)體類型內(nèi)存零開銷這樣的特性,我們在日常 Go 開發(fā)中會經(jīng)常使用空 結(jié)構(gòu)體類型元素,作為一種“事件”信息進(jìn)行 Goroutine 之間的通信

這種以空結(jié)構(gòu)體為元素類建立的 channel,是目前能實現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。

這種形式需要說的是幾個語法糖。

語法糖1:

對于結(jié)構(gòu)體字段,可以省略字段名,只寫結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名

這種方式稱為 嵌入字段

語法糖2:

如果是以嵌入字段形式寫的結(jié)構(gòu)體

可以省略嵌入的Reader字段,而直接訪問ReaderName

此時book是一個各個屬性全是對應(yīng)類型零值的一個實例。不是nil。這種情況在Go中稱為零值可用。不像java會導(dǎo)致npe

結(jié)構(gòu)體定義時可以在字段后面追加標(biāo)簽說明。

tag的格式為反單引號

tag的作用是可以使用[反射]來檢視字段的標(biāo)簽信息。

具體的作用還要看使用的場景。

比如這里的tag是為了幫助 encoding/json 標(biāo)準(zhǔn)包在解析對象時可以利用的規(guī)則。比如omitempty表示該字段沒有值就不打印出來。

數(shù)據(jù)段保存有如下字符串:string byte

string是Go語言中的基礎(chǔ)數(shù)據(jù)類型。

聲明string變量非常簡單,常見的方式有以下兩種:

聲明一個空字符串后再賦值。

var s string。

s = "hello world"。

需要注意的是空字符只是長度為0,但不是nil。不存在值為nil的string。

使用簡短變量聲明:

s := "hello world" //直接初始化字符串。

雙引號與單引號。

字符串不僅可以使用雙引號賦值,也可以使用反單引號賦值,它們的區(qū)別是在于對特殊字符的處理。

假如我們希望string變量表示下面的字符串,它包括換行符和雙引號:

Hi。

this is "Steven"。

1。

2。

使用雙引號表示時,需要對特殊字符轉(zhuǎn)義,如下所示:

s:= "Hi, \nthis is \"Steven\"."。

1。

如果使用反單引號時,不需要對特殊符號轉(zhuǎn)義,如下所示:

s := Hi。

this is "Steven"。

需要注意的是,字符串拼接會觸發(fā)內(nèi)存分配以及內(nèi)存拷貝,單行語句拼接多個字符串只分配一次內(nèi)存。比如上面的語句中,在拼接時,會先計算最終字符串的長度后再分配內(nèi)存。

類型轉(zhuǎn)換:

項目中,數(shù)據(jù)經(jīng)常需要在string和字節(jié)[]byte之間轉(zhuǎn)換。

基礎(chǔ)知識 - Golang 中的格式化輸入輸出

【格式化輸出】

// 格式化輸出:將 arg 列表中的 arg 轉(zhuǎn)換為字符串輸出

// 使用動詞 v 格式化 arg 列表,非字符串元素之間添加空格

Print(arg列表)

// 使用動詞 v 格式化 arg 列表,所有元素之間添加空格,結(jié)尾添加換行符

Println(arg列表)

// 使用格式字符串格式化 arg 列表

Printf(格式字符串, arg列表)

// Print 類函數(shù)會返回已處理的 arg 數(shù)量和遇到的錯誤信息。

【格式字符串】

格式字符串由普通字符和占位符組成,例如:

"abc%+ #8.3[3]vdef"

其中 abc 和 def 是普通字符,其它部分是占位符,占位符以 % 開頭(注:%% 將被轉(zhuǎn)義為一個普通的 % 符號,這個不算開頭),以動詞結(jié)尾,格式如下:

%[旗標(biāo)][寬度][.精度][arg索引]動詞

方括號中的內(nèi)容可以省略。

【旗標(biāo)】

旗標(biāo)有以下幾種:

空格:對于數(shù)值類型的正數(shù),保留一個空白的符號位(其它用法在動詞部分說明)。

0 :用 0 進(jìn)行寬度填充而不用空格,對于數(shù)值類型,符號將被移到所有 0 的前面。

其中 "0" 和 "-" 不能同時使用,優(yōu)先使用 "-" 而忽略 "0"。

【寬度和精度】

“寬度”和“精度”都可以寫成以下三種形式:

數(shù)值 | * | arg索引*

其中“數(shù)值”表示使用指定的數(shù)值作為寬度值或精度值,“ ”表示使用當(dāng)前正在處理的 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉(zhuǎn)到下一個?!癮rg索引 ”表示使用指定 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉(zhuǎn)到指定 arg 的下一個。

寬度值:用于設(shè)置最小寬度。

精度值:對于浮點型,用于控制小數(shù)位數(shù),對于字符串或字節(jié)數(shù)組,用于控制字符數(shù)量(不是字節(jié)數(shù)量)。

對于浮點型而言,動詞 g/G 的精度值比較特殊,在適當(dāng)?shù)那闆r下,g/G 會設(shè)置總有效數(shù)字,而不是小數(shù)位數(shù)。

【arg 索引】

“arg索引”由中括號和 arg 序號組成(就像上面示例中的 [3]),用于指定當(dāng)前要處理的 arg 的序號,序號從 1 開始:

'[' + arg序號 + ']'

【動詞】

“動詞”不能省略,不同的數(shù)據(jù)類型支持的動詞不一樣。

[通用動詞]

v:默認(rèn)格式,不同類型的默認(rèn)格式如下:

布爾型:t

整 型:d

浮點型:g

復(fù)數(shù)型:g

字符串:s

通 道:p

指 針:p

無符號整型:x

T:輸出 arg 的類型而不是值(使用 Go 語法格式)。

[布爾型]

t:輸出 true 或 false 字符串。

[整型]

b/o/d:輸出 2/8/10 進(jìn)制格式

x/X :輸出 16 進(jìn)制格式(小寫/大寫)

c :輸出數(shù)值所表示的 Unicode 字符

q :輸出數(shù)值所表示的 Unicode 字符(帶單引號)。對于無法顯示的字符,將輸出其轉(zhuǎn)義字符。

U :輸出 Unicode 碼點(例如 U+1234,等同于字符串 "U+%04X" 的顯示結(jié)果)

對于 o/x/X:

如果使用 "#" 旗標(biāo),則會添加前導(dǎo) 0 或 0x。

對于 U:

如果使用 "#" 旗標(biāo),則會在 Unicode 碼點后面添加相應(yīng)的 '字符'(前提是該字符必須可顯示)

[浮點型和復(fù)數(shù)型]

b :科學(xué)計數(shù)法(以 2 為底)

e/E:科學(xué)計數(shù)法(以 10 為底,小寫 e/大寫 E)

f/F:普通小數(shù)格式(兩者無區(qū)別)

g/G:大指數(shù)(指數(shù) = 6)使用 %e/%E,其它情況使用 %f/%F

[字符串或字節(jié)切片]

s :普通字符串

q :雙引號引起來的 Go 語法字符串

x/X:十六進(jìn)制編碼(小寫/大寫,以字節(jié)為元素進(jìn)行編碼,而不是字符)

對于 q:

如果使用了 "+" 旗標(biāo),則將所有非 ASCII 字符都進(jìn)行轉(zhuǎn)義處理。

如果使用了 "#" 旗標(biāo),則輸出反引號引起來的字符串(前提是

字符串中不包含任何制表符以外的控制字符,否則忽略 # 旗標(biāo))

對于 x/X:

如果使用了 " " 旗標(biāo),則在每個元素之間添加空格。

如果使用了 "#" 旗標(biāo),則在十六進(jìn)制格式之前添加 0x 前綴。

[指針類型]

p :帶 0x 前綴的十六進(jìn)制地址值。

[符合類型]

復(fù)合類型將使用不同的格式輸出,格式如下:

結(jié) 構(gòu) 體:{字段1 字段2 ...}

數(shù)組或切片:[元素0 元素1 ...]

映 射:map[鍵1:值1 鍵2:值2 ...]

指向符合元素的指針:{}, [], map[]

復(fù)合類型本身沒有動詞,動詞將應(yīng)用到復(fù)合類型的元素上。

結(jié)構(gòu)體可以使用 "+v" 同時輸出字段名。

【注意】

1、如果 arg 是一個反射值,則該 arg 將被它所持有的具體值所取代。

2、如果 arg 實現(xiàn)了 Formatter 接口,將調(diào)用它的 Format 方法完成格式化。

3、如果 v 動詞使用了 # 旗標(biāo)(%#v),并且 arg 實現(xiàn)了 GoStringer 接口,將調(diào)用它的 GoString 方法完成格式化。

如果格式化操作指定了字符串相關(guān)的動詞(比如 %s、%q、%v、%x、%X),接下來的兩條規(guī)則將適用:

4。如果 arg 實現(xiàn)了 error 接口,將調(diào)用它的 Error 方法完成格式化。

5。如果 arg 實現(xiàn)了 string 接口,將調(diào)用它的 String 方法完成格式化。

在實現(xiàn)格式化相關(guān)接口的時候,要避免無限遞歸的情況,比如:

type X string

func (x X) String() string {

return Sprintf("%s", x)

}

在格式化之前,要先轉(zhuǎn)換數(shù)據(jù)類型,這樣就可以避免無限遞歸:

func (x X) String() string {

return Sprintf("%s", string(x))

}

無限遞歸也可能發(fā)生在自引用數(shù)據(jù)類型上面,比如一個切片的元素引用了切片自身。這種情況比較罕見,比如:

a := make([]interface{}, 1)

a[0] = a

fmt.Println(a)

【格式化輸入】

// 格式化輸入:從輸入端讀取字符串(以空白分隔的值的序列),

// 并解析為具體的值存入相應(yīng)的 arg 中,arg 必須是變量地址。

// 字符串中的連續(xù)空白視為單個空白,換行符根據(jù)不同情況處理。

// \r\n 被當(dāng)做 \n 處理。

// 以動詞 v 解析字符串,換行視為空白

Scan(arg列表)

// 以動詞 v 解析字符串,換行結(jié)束解析

Scanln(arg列表)

// 根據(jù)格式字符串中指定的格式解析字符串

// 格式字符串中的換行符必須和輸入端的換行符相匹配。

Scanf(格式字符串, arg列表)

// Scan 類函數(shù)會返回已處理的 arg 數(shù)量和遇到的錯誤信息。

【格式字符串】

格式字符串類似于 Printf 中的格式字符串,但下面的動詞和旗標(biāo)例外:

p :無效

T :無效

e/E/f/F/g/G:功能相同,都是掃描浮點數(shù)或復(fù)數(shù)

s/v :對字符串而言,掃描一個被空白分隔的子串

對于整型 arg 而言,v 動詞可以掃描帶有前導(dǎo) 0 或 0x 的八進(jìn)制或十六進(jìn)制數(shù)值。

寬度被用來指定最大掃描寬度(不會跨越空格),精度不被支持。

如果 arg 實現(xiàn)了 Scanner 接口,將調(diào)用它的 Scan 方法掃描相應(yīng)數(shù)據(jù)。只有基礎(chǔ)類型和實現(xiàn)了 Scanner 接口的類型可以使用 Scan 類方法進(jìn)行掃描。

【注意】

連續(xù)調(diào)用 FScan 可能會丟失數(shù)據(jù),因為 FScan 中使用了 UnreadRune 對讀取的數(shù)據(jù)進(jìn)行撤銷,而參數(shù) io.Reader 只有 Read 方法,不支持撤銷。比如:


標(biāo)題名稱:go語言中的單引號 go語言引用
分享地址:http://weahome.cn/article/dohigoe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部