struct是Go中的關(guān)鍵字,用于定義結(jié)構(gòu)類(lèi)型。

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、當(dāng)雄ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的當(dāng)雄網(wǎng)站制作公司
例如:
struct {}是一個(gè)無(wú)元素的結(jié)構(gòu)體類(lèi)型,通常在沒(méi)有信息存儲(chǔ)時(shí)使用。優(yōu)點(diǎn)是大小為0,不需要內(nèi)存來(lái)存儲(chǔ)struct {}類(lèi)型的值。
struct {} {}是一個(gè)復(fù)合字面量,它構(gòu)造了一個(gè)struct {}類(lèi)型的值,該值也是空。
go中可以使用 unsafe.Sizeof 計(jì)算出一個(gè)數(shù)據(jù)類(lèi)型實(shí)例需要占用的字節(jié)數(shù)。我們驗(yàn)證一下:
也就是說(shuō)空結(jié)構(gòu)體實(shí)例不占用任何內(nèi)存空間。
Go 語(yǔ)言標(biāo)準(zhǔn)庫(kù)沒(méi)有提供 Set 的實(shí)現(xiàn),通常使用 map 來(lái)代替。事實(shí)上,對(duì)于集合來(lái)說(shuō),只需要 map 的鍵,而不需要值。
聲明為聲明為 map[string]struct{} ,由于struct{}是空,不關(guān)心內(nèi)容,這樣map便改造為set 。
map可以通過(guò)“comma ok”機(jī)制來(lái)獲取該key是否存在,例如 _, ok := map["key"] ,如果沒(méi)有對(duì)應(yīng)的值,ok為false。可以通過(guò)定義成 map[string]struct{} 的形式,值不再占用內(nèi)存。其值僅有兩種狀態(tài),有或無(wú)。如果定義的是 map[string]bool ,則結(jié)果有true、false或沒(méi)有三種狀態(tài),而且即使是將值設(shè)置為 bool 類(lèi)型,也會(huì)多占據(jù) 1 個(gè)字節(jié)。因此呢,將 map 作為集合(Set)使用時(shí),可以將值類(lèi)型定義為空結(jié)構(gòu)體,僅作為占位符使用即可。
基于channels發(fā)送消息有兩個(gè)重要方面:發(fā)了消息、發(fā)了什么消息。一個(gè)強(qiáng)調(diào)了通訊的發(fā)生,一個(gè)強(qiáng)調(diào)了通訊的內(nèi)容。當(dāng)我們更希望強(qiáng)調(diào)通訊發(fā)生的時(shí)刻時(shí),我們將它稱(chēng)為 消息事件 。有些消息事件并不攜帶額外的信息,它僅僅是用作兩個(gè)goroutine之間的同步,這時(shí)候我們可以用 struct{} 空結(jié)構(gòu)體作為channels元素的類(lèi)型。用來(lái)通知子協(xié)程(goroutine)執(zhí)行任務(wù),或只用來(lái)控制協(xié)程并發(fā)度。
在部分場(chǎng)景下,結(jié)構(gòu)體只包含方法,不包含任何的字段。這時(shí)候我們就可以使用空結(jié)構(gòu)體。
其實(shí),上面的calculateInt 可以是任何類(lèi)型,如 type calculateInt bool ,但是struct{}不占用任何空間,邏輯上也更合理,因此還是它最好。
這些是死知識(shí),把常用的記住,不常用的直接查表就行了
golang 的fmt 包實(shí)現(xiàn)了格式化I/O函數(shù),類(lèi)似于C的 printf 和 scanf。
type Human struct {
Name string
}
var people = Human{Name:"zhangsan"}
golang沒(méi)有 '%u' 點(diǎn)位符,若整數(shù)為無(wú)符號(hào)類(lèi)型,默認(rèn)就會(huì)被打印成無(wú)符號(hào)的。
寬度與精度的控制格式以Unicode碼點(diǎn)為單位。寬度為該數(shù)值占用區(qū)域的最小寬度;精度為小數(shù)點(diǎn)之后的位數(shù)。
操作數(shù)的類(lèi)型為int時(shí),寬度與精度都可用字符 '*' 表示。
對(duì)于 %g/%G 而言,精度為所有數(shù)字的總數(shù),例如:123.45,%.4g 會(huì)打印123.5,(而 %6.2f 會(huì)打印123.45)。
%e 和 %f 的默認(rèn)精度為6
對(duì)大多數(shù)的數(shù)值類(lèi)型而言,寬度為輸出的最小字符數(shù),如果必要的話(huà)會(huì)為已格式化的形式填充空格。
而以字符串類(lèi)型,精度為輸出的最大字符數(shù),如果必要的話(huà)會(huì)直接截?cái)唷?/p>
使用起來(lái)很簡(jiǎn)單,一般配合fmt.Printf()使用,因?yàn)閒mt的Printf()是有格式的輸出,切忌使用Println(),否則將會(huì)以字符串的形式輸出。
查看原文: golang fmt格式“占位符”
在Go中,error是一種內(nèi)建的數(shù)據(jù)類(lèi)型。在Go中被定義為一個(gè)接口,定義如下:
由此可知,該接口只有一個(gè)返回字符串的Error函數(shù),所有的類(lèi)型只要實(shí)現(xiàn)了該函數(shù),就創(chuàng)建了一個(gè)錯(cuò)誤類(lèi)型。
創(chuàng)建error的方式包括errors.New、fmt.Errorf、自定義實(shí)現(xiàn)了error接口的類(lèi)型等。
2.1 通過(guò)errors.New方法創(chuàng)建
通過(guò)該方法創(chuàng)建的錯(cuò)誤一般是可預(yù)知的錯(cuò)誤。簡(jiǎn)單來(lái)說(shuō)就是調(diào)用者通過(guò)該錯(cuò)誤信息就能明確的知道哪里出錯(cuò)了,而不需要再額外的添加其他上下文信息,我們?cè)谙旅娴氖纠性敿?xì)說(shuō)明。
我們看New方法的實(shí)現(xiàn)可知,實(shí)際上是返回了一個(gè)errorString結(jié)構(gòu)體,該結(jié)構(gòu)體包含了一個(gè)字符串屬性,并實(shí)現(xiàn)了Error方法。代碼如下:
error.New使用場(chǎng)景1 :
通過(guò)errors.New函數(shù)創(chuàng)建局部變量或匿名變量,且不在調(diào)用函數(shù)中進(jìn)行值或類(lèi)型判斷的處理,只打印或記錄錯(cuò)誤日志的場(chǎng)景。
使用示例1 :
以下代碼節(jié)選自源碼/src/net/http/request.go中解析PostForm的部分。 當(dāng)請(qǐng)求中的Body為nil時(shí),返回的錯(cuò)誤信息是"missing form body"。該信息已明確的說(shuō)明錯(cuò)誤是因?yàn)檎?qǐng)求體為空造成的,所以不需要再額外的添加其他上下文信息。
使用示例2
以下代碼選擇源碼/src/net/http/transport.go的部分,當(dāng)請(qǐng)求體中的url地址為nil返回的錯(cuò)誤:"http: nil Request.URL" ,說(shuō)明是請(qǐng)求中的URL字段為nil。以及當(dāng)Header為nil返回的錯(cuò)誤:"http:nil Request.Header",說(shuō)明請(qǐng)求體中的Header字段為nil。
error.New使用場(chǎng)景2 :
將errors.New創(chuàng)建的錯(cuò)誤賦值給一個(gè)全局的變量,我們稱(chēng)該變量為哨兵錯(cuò)誤,該哨兵錯(cuò)誤變量可以在被處理的時(shí)候使用 == 或 errors.Is來(lái)進(jìn)行值的比較。
使用示例 : 在源碼/src/io/io.go中定義的代表文件末尾的哨兵錯(cuò)誤變量EOF。
在beego項(xiàng)目中,beego/core/utils/file.go文件中有這樣的應(yīng)用,當(dāng)讀取文件時(shí),遇到的錯(cuò)誤不是文件末尾的錯(cuò)誤則直接返回,如果遇到的是文件末尾的錯(cuò)誤,則中斷for循環(huán),說(shuō)明文件已經(jīng)讀完文件中的所有內(nèi)容了。如下:
2.2 通過(guò)fmt.Errorf方法創(chuàng)建
使用場(chǎng)景1:不帶%w占位符 :
在創(chuàng)建錯(cuò)誤的時(shí)候,不能通過(guò)errors.New創(chuàng)建的字符串信息來(lái)描述錯(cuò)誤,而需要通過(guò)占位符添加更多的上下文信息,即動(dòng)態(tài)信息。
使用示例:不帶%w占位符 :
以下示例節(jié)選自gorm/schema/relationship.go的部分代碼,當(dāng)外鍵不合法時(shí),通過(guò)fmt.Errorf("invalid foreign key:%s", foreignKey)返回帶具體外鍵的錯(cuò)誤。因?yàn)橥怄I值是在運(yùn)行時(shí)才能確定的。代碼如下:
使用場(chǎng)景2:帶%w的占位符 :
在有些場(chǎng)景下,調(diào)用者需要知道原始錯(cuò)誤信息,一般會(huì)通過(guò)errors.Is函數(shù)進(jìn)行判斷該錯(cuò)誤鏈中是否包含某種特定類(lèi)型的原始錯(cuò)誤值。
使用%w占位符創(chuàng)建的錯(cuò)誤信息,其實(shí)會(huì)形成一個(gè)錯(cuò)誤鏈。其用法如下:
我們?cè)賮?lái)看下源代碼:
通過(guò)源碼可知,如果fmt.Errorf中包含%w占位符,創(chuàng)建的是一個(gè)wrapError結(jié)構(gòu)體類(lèi)型的值。我們?cè)賮?lái)看下wrapError結(jié)構(gòu)體的定義:
字段err就是原始錯(cuò)誤,msg是經(jīng)過(guò)格式化之后的錯(cuò)誤信息。
使用示例:帶%w的占位符 :
假設(shè)我們有一個(gè)從數(shù)據(jù)庫(kù)查詢(xún)合同的函數(shù),當(dāng)從數(shù)據(jù)庫(kù)中查詢(xún)到記錄為空時(shí),會(huì)返回一個(gè)sql.ErrNoRows錯(cuò)誤,我們用%w占位符來(lái)wrap該錯(cuò)誤,并返回給調(diào)用者。
好了,現(xiàn)在GetContract的調(diào)用者可以知道原始的錯(cuò)誤信息了。在調(diào)用者邏輯中我們可以使用errors.Is來(lái)判斷err中是否包含sql.ErrNoRows值了。我們看下調(diào)用者的代碼:
使用場(chǎng)景 :這個(gè)是相對(duì)errors.New來(lái)說(shuō)的,errors.New適用于對(duì)可預(yù)知的錯(cuò)誤的定義。而當(dāng)發(fā)生了不可預(yù)知的錯(cuò)誤時(shí),就需要自定義錯(cuò)誤類(lèi)型了。
使用示例 : 我們以go源碼/src/io/fs/fs.go文件中的源碼為例,來(lái)看下自定義錯(cuò)誤類(lèi)型都需要包含哪些元素。
首先看結(jié)構(gòu)體,有一個(gè)error接口類(lèi)型的Err,這個(gè)代表的是錯(cuò)誤源,因?yàn)楦鶕?jù)上面講解的,在錯(cuò)誤層層傳遞返回給調(diào)用者時(shí),我們需要追蹤每一層的原始錯(cuò)誤信息,所以需要該字段對(duì)error進(jìn)行wrap,形成錯(cuò)誤鏈。另外,有兩個(gè)字段Op和Path,分別代表是產(chǎn)生該錯(cuò)誤的操作和操作的路徑。這兩個(gè)字段就是所謂的未預(yù)料到的錯(cuò)誤:不確定是針對(duì)哪個(gè)路徑做了什么錯(cuò)誤引發(fā)了該錯(cuò)誤。
我們看下該錯(cuò)誤類(lèi)型在代碼中的應(yīng)用:
應(yīng)用1 :在go的文件src/embed/embed.go中的代碼,當(dāng)讀取某目錄時(shí)返回的一個(gè)PathError類(lèi)型的錯(cuò)誤,代表讀取該目錄操作時(shí),因?yàn)槭且粋€(gè)目錄,所以不能直接讀取文件內(nèi)容。
應(yīng)用2 :在go的文件src/embed/embed.go中的代碼中,有文件讀取的函數(shù),當(dāng)offset小于0時(shí),返回了一個(gè)PathError,代表是在讀取該文件的時(shí)候,參數(shù)不正確。
fs.ErrInvalid的定義如下:
由此可見(jiàn),PathError中的三個(gè)字段值都是不可預(yù)知的,都需要在程序運(yùn)行時(shí)才能具體決定的,所以這種場(chǎng)景時(shí),則需要自定義錯(cuò)誤類(lèi)型。
另外,我們還注意到該自定義的類(lèi)型中有Unwrap函數(shù)的實(shí)現(xiàn),該函數(shù)主要是為了配合errors.Is和errors.As使用的,因?yàn)檫@兩個(gè)函數(shù)在使用時(shí)是將錯(cuò)誤鏈層層解包一一比對(duì)的。
根據(jù)上一節(jié)我們得到,通過(guò)%w占位符可以將錯(cuò)誤組織成一個(gè)錯(cuò)誤鏈。
errors.Is函數(shù)就是來(lái)判斷錯(cuò)誤鏈中有沒(méi)有和指定的錯(cuò)誤值相等的錯(cuò)誤,相等于 == 操作符 。注意,這里是特定的錯(cuò)誤值,就像gorm中定義的ErrRecordNotFound這樣:
那么我們就可以這樣使用errors.Is:
errors.As函數(shù),這個(gè)函數(shù)是用來(lái)檢查錯(cuò)誤鏈中的錯(cuò)誤是否是特定的類(lèi)型 。如下代碼示例是節(jié)選自etcd項(xiàng)目中etcd/server/embed/config_logging.go中的部分代碼,代表的是err鏈中有沒(méi)有能當(dāng)做json.SyntaxError類(lèi)型的錯(cuò)誤的,如果能,則將err中的錯(cuò)誤值賦值到syntaxError變量上,代碼如下:
本文從應(yīng)用場(chǎng)景的角度講解了各種創(chuàng)建錯(cuò)誤方式的實(shí)際應(yīng)用場(chǎng)景。示例中的代碼盡量的選自golang源碼或開(kāi)源項(xiàng)目。 同時(shí),每種的應(yīng)用場(chǎng)景并非絕對(duì)的,需要靈活應(yīng)用。希望本文對(duì)大家在實(shí)際使用中能夠有所幫助。
【格式化輸出】
// 格式化輸出:將 arg 列表中的 arg 轉(zhuǎn)換為字符串輸出
// 使用動(dòng)詞 v 格式化 arg 列表,非字符串元素之間添加空格
Print(arg列表)
// 使用動(dòng)詞 v 格式化 arg 列表,所有元素之間添加空格,結(jié)尾添加換行符
Println(arg列表)
// 使用格式字符串格式化 arg 列表
Printf(格式字符串, arg列表)
// Print 類(lèi)函數(shù)會(huì)返回已處理的 arg 數(shù)量和遇到的錯(cuò)誤信息。
【格式字符串】
格式字符串由普通字符和占位符組成,例如:
"abc%+ #8.3[3]vdef"
其中 abc 和 def 是普通字符,其它部分是占位符,占位符以 % 開(kāi)頭(注:%% 將被轉(zhuǎn)義為一個(gè)普通的 % 符號(hào),這個(gè)不算開(kāi)頭),以動(dòng)詞結(jié)尾,格式如下:
%[旗標(biāo)][寬度][.精度][arg索引]動(dòng)詞
方括號(hào)中的內(nèi)容可以省略。
【旗標(biāo)】
旗標(biāo)有以下幾種:
空格:對(duì)于數(shù)值類(lèi)型的正數(shù),保留一個(gè)空白的符號(hào)位(其它用法在動(dòng)詞部分說(shuō)明)。
0 :用 0 進(jìn)行寬度填充而不用空格,對(duì)于數(shù)值類(lèi)型,符號(hào)將被移到所有 0 的前面。
其中 "0" 和 "-" 不能同時(shí)使用,優(yōu)先使用 "-" 而忽略 "0"。
【寬度和精度】
“寬度”和“精度”都可以寫(xiě)成以下三種形式:
數(shù)值 | * | arg索引*
其中“數(shù)值”表示使用指定的數(shù)值作為寬度值或精度值,“ ”表示使用當(dāng)前正在處理的 arg 的值作為寬度值或精度值,如果這樣的話(huà),要格式化的 arg 將自動(dòng)跳轉(zhuǎn)到下一個(gè)。“arg索引 ”表示使用指定 arg 的值作為寬度值或精度值,如果這樣的話(huà),要格式化的 arg 將自動(dòng)跳轉(zhuǎn)到指定 arg 的下一個(gè)。
寬度值:用于設(shè)置最小寬度。
精度值:對(duì)于浮點(diǎn)型,用于控制小數(shù)位數(shù),對(duì)于字符串或字節(jié)數(shù)組,用于控制字符數(shù)量(不是字節(jié)數(shù)量)。
對(duì)于浮點(diǎn)型而言,動(dòng)詞 g/G 的精度值比較特殊,在適當(dāng)?shù)那闆r下,g/G 會(huì)設(shè)置總有效數(shù)字,而不是小數(shù)位數(shù)。
【arg 索引】
“arg索引”由中括號(hào)和 arg 序號(hào)組成(就像上面示例中的 [3]),用于指定當(dāng)前要處理的 arg 的序號(hào),序號(hào)從 1 開(kāi)始:
'[' + arg序號(hào) + ']'
【動(dòng)詞】
“動(dòng)詞”不能省略,不同的數(shù)據(jù)類(lèi)型支持的動(dòng)詞不一樣。
[通用動(dòng)詞]
v:默認(rèn)格式,不同類(lèi)型的默認(rèn)格式如下:
布爾型:t
整 型:d
浮點(diǎn)型:g
復(fù)數(shù)型:g
字符串:s
通 道:p
指 針:p
無(wú)符號(hào)整型:x
T:輸出 arg 的類(lèi)型而不是值(使用 Go 語(yǔ)法格式)。
[布爾型]
t:輸出 true 或 false 字符串。
[整型]
b/o/d:輸出 2/8/10 進(jìn)制格式
x/X :輸出 16 進(jìn)制格式(小寫(xiě)/大寫(xiě))
c :輸出數(shù)值所表示的 Unicode 字符
q :輸出數(shù)值所表示的 Unicode 字符(帶單引號(hào))。對(duì)于無(wú)法顯示的字符,將輸出其轉(zhuǎn)義字符。
U :輸出 Unicode 碼點(diǎn)(例如 U+1234,等同于字符串 "U+%04X" 的顯示結(jié)果)
對(duì)于 o/x/X:
如果使用 "#" 旗標(biāo),則會(huì)添加前導(dǎo) 0 或 0x。
對(duì)于 U:
如果使用 "#" 旗標(biāo),則會(huì)在 Unicode 碼點(diǎn)后面添加相應(yīng)的 '字符'(前提是該字符必須可顯示)
[浮點(diǎn)型和復(fù)數(shù)型]
b :科學(xué)計(jì)數(shù)法(以 2 為底)
e/E:科學(xué)計(jì)數(shù)法(以 10 為底,小寫(xiě) e/大寫(xiě) E)
f/F:普通小數(shù)格式(兩者無(wú)區(qū)別)
g/G:大指數(shù)(指數(shù) = 6)使用 %e/%E,其它情況使用 %f/%F
[字符串或字節(jié)切片]
s :普通字符串
q :雙引號(hào)引起來(lái)的 Go 語(yǔ)法字符串
x/X:十六進(jìn)制編碼(小寫(xiě)/大寫(xiě),以字節(jié)為元素進(jìn)行編碼,而不是字符)
對(duì)于 q:
如果使用了 "+" 旗標(biāo),則將所有非 ASCII 字符都進(jìn)行轉(zhuǎn)義處理。
如果使用了 "#" 旗標(biāo),則輸出反引號(hào)引起來(lái)的字符串(前提是
字符串中不包含任何制表符以外的控制字符,否則忽略 # 旗標(biāo))
對(duì)于 x/X:
如果使用了 " " 旗標(biāo),則在每個(gè)元素之間添加空格。
如果使用了 "#" 旗標(biāo),則在十六進(jìn)制格式之前添加 0x 前綴。
[指針類(lèi)型]
p :帶 0x 前綴的十六進(jìn)制地址值。
[符合類(lèi)型]
復(fù)合類(lèi)型將使用不同的格式輸出,格式如下:
結(jié) 構(gòu) 體:{字段1 字段2 ...}
數(shù)組或切片:[元素0 元素1 ...]
映 射:map[鍵1:值1 鍵2:值2 ...]
指向符合元素的指針:{}, [], map[]
復(fù)合類(lèi)型本身沒(méi)有動(dòng)詞,動(dòng)詞將應(yīng)用到復(fù)合類(lèi)型的元素上。
結(jié)構(gòu)體可以使用 "+v" 同時(shí)輸出字段名。
【注意】
1、如果 arg 是一個(gè)反射值,則該 arg 將被它所持有的具體值所取代。
2、如果 arg 實(shí)現(xiàn)了 Formatter 接口,將調(diào)用它的 Format 方法完成格式化。
3、如果 v 動(dòng)詞使用了 # 旗標(biāo)(%#v),并且 arg 實(shí)現(xiàn)了 GoStringer 接口,將調(diào)用它的 GoString 方法完成格式化。
如果格式化操作指定了字符串相關(guān)的動(dòng)詞(比如 %s、%q、%v、%x、%X),接下來(lái)的兩條規(guī)則將適用:
4。如果 arg 實(shí)現(xiàn)了 error 接口,將調(diào)用它的 Error 方法完成格式化。
5。如果 arg 實(shí)現(xiàn)了 string 接口,將調(diào)用它的 String 方法完成格式化。
在實(shí)現(xiàn)格式化相關(guān)接口的時(shí)候,要避免無(wú)限遞歸的情況,比如:
type X string
func (x X) String() string {
return Sprintf("%s", x)
}
在格式化之前,要先轉(zhuǎn)換數(shù)據(jù)類(lèi)型,這樣就可以避免無(wú)限遞歸:
func (x X) String() string {
return Sprintf("%s", string(x))
}
無(wú)限遞歸也可能發(fā)生在自引用數(shù)據(jù)類(lèi)型上面,比如一個(gè)切片的元素引用了切片自身。這種情況比較罕見(jiàn),比如:
a := make([]interface{}, 1)
a[0] = a
fmt.Println(a)
【格式化輸入】
// 格式化輸入:從輸入端讀取字符串(以空白分隔的值的序列),
// 并解析為具體的值存入相應(yīng)的 arg 中,arg 必須是變量地址。
// 字符串中的連續(xù)空白視為單個(gè)空白,換行符根據(jù)不同情況處理。
// \r\n 被當(dāng)做 \n 處理。
// 以動(dòng)詞 v 解析字符串,換行視為空白
Scan(arg列表)
// 以動(dòng)詞 v 解析字符串,換行結(jié)束解析
Scanln(arg列表)
// 根據(jù)格式字符串中指定的格式解析字符串
// 格式字符串中的換行符必須和輸入端的換行符相匹配。
Scanf(格式字符串, arg列表)
// Scan 類(lèi)函數(shù)會(huì)返回已處理的 arg 數(shù)量和遇到的錯(cuò)誤信息。
【格式字符串】
格式字符串類(lèi)似于 Printf 中的格式字符串,但下面的動(dòng)詞和旗標(biāo)例外:
p :無(wú)效
T :無(wú)效
e/E/f/F/g/G:功能相同,都是掃描浮點(diǎn)數(shù)或復(fù)數(shù)
s/v :對(duì)字符串而言,掃描一個(gè)被空白分隔的子串
對(duì)于整型 arg 而言,v 動(dòng)詞可以?huà)呙鑾в星皩?dǎo) 0 或 0x 的八進(jìn)制或十六進(jìn)制數(shù)值。
寬度被用來(lái)指定最大掃描寬度(不會(huì)跨越空格),精度不被支持。
如果 arg 實(shí)現(xiàn)了 Scanner 接口,將調(diào)用它的 Scan 方法掃描相應(yīng)數(shù)據(jù)。只有基礎(chǔ)類(lèi)型和實(shí)現(xiàn)了 Scanner 接口的類(lèi)型可以使用 Scan 類(lèi)方法進(jìn)行掃描。
【注意】
連續(xù)調(diào)用 FScan 可能會(huì)丟失數(shù)據(jù),因?yàn)?FScan 中使用了 UnreadRune 對(duì)讀取的數(shù)據(jù)進(jìn)行撤銷(xiāo),而參數(shù) io.Reader 只有 Read 方法,不支持撤銷(xiāo)。比如:
本文名稱(chēng):go語(yǔ)言占位符的用法 go語(yǔ)言類(lèi)型后置
標(biāo)題來(lái)源:http://chinadenli.net/article38/dojoisp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)