新聞中心
Go語言的%d,%p,%v等占位符的使用
這些是死知識,把常用的記住,不常用的直接查表就行了
創(chuàng)新互聯(lián)成立與2013年,先為惠民等服務(wù)建站,惠民等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為惠民企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
golang 的fmt 包實現(xiàn)了格式化I/O函數(shù),類似于C的 printf 和 scanf。
type Human struct {
Name string
}
var people = Human{Name:"zhangsan"}
golang沒有 '%u' 點位符,若整數(shù)為無符號類型,默認(rèn)就會被打印成無符號的。
寬度與精度的控制格式以Unicode碼點為單位。寬度為該數(shù)值占用區(qū)域的最小寬度;精度為小數(shù)點之后的位數(shù)。
操作數(shù)的類型為int時,寬度與精度都可用字符 '*' 表示。
對于 %g/%G 而言,精度為所有數(shù)字的總數(shù),例如:123.45,%.4g 會打印123.5,(而 %6.2f 會打印123.45)。
%e 和 %f 的默認(rèn)精度為6
對大多數(shù)的數(shù)值類型而言,寬度為輸出的最小字符數(shù),如果必要的話會為已格式化的形式填充空格。
而以字符串類型,精度為輸出的最大字符數(shù),如果必要的話會直接截斷。
使用起來很簡單,一般配合fmt.Printf()使用,因為fmt的Printf()是有格式的輸出,切忌使用Println(),否則將會以字符串的形式輸出。
查看原文: golang fmt格式“占位符”
Go 空結(jié)構(gòu)體 struct{} 的使用
struct是Go中的關(guān)鍵字,用于定義結(jié)構(gòu)類型。
例如:
struct {}是一個無元素的結(jié)構(gòu)體類型,通常在沒有信息存儲時使用。優(yōu)點是大小為0,不需要內(nèi)存來存儲struct {}類型的值。
struct {} {}是一個復(fù)合字面量,它構(gòu)造了一個struct {}類型的值,該值也是空。
go中可以使用 unsafe.Sizeof 計算出一個數(shù)據(jù)類型實例需要占用的字節(jié)數(shù)。我們驗證一下:
也就是說空結(jié)構(gòu)體實例不占用任何內(nèi)存空間。
Go 語言標(biāo)準(zhǔn)庫沒有提供 Set 的實現(xiàn),通常使用 map 來代替。事實上,對于集合來說,只需要 map 的鍵,而不需要值。
聲明為聲明為 map[string]struct{} ,由于struct{}是空,不關(guān)心內(nèi)容,這樣map便改造為set 。
map可以通過“comma ok”機制來獲取該key是否存在,例如 _, ok := map["key"] ,如果沒有對應(yīng)的值,ok為false。可以通過定義成 map[string]struct{} 的形式,值不再占用內(nèi)存。其值僅有兩種狀態(tài),有或無。如果定義的是 map[string]bool ,則結(jié)果有true、false或沒有三種狀態(tài),而且即使是將值設(shè)置為 bool 類型,也會多占據(jù) 1 個字節(jié)。因此呢,將 map 作為集合(Set)使用時,可以將值類型定義為空結(jié)構(gòu)體,僅作為占位符使用即可。
基于channels發(fā)送消息有兩個重要方面:發(fā)了消息、發(fā)了什么消息。一個強調(diào)了通訊的發(fā)生,一個強調(diào)了通訊的內(nèi)容。當(dāng)我們更希望強調(diào)通訊發(fā)生的時刻時,我們將它稱為 消息事件 。有些消息事件并不攜帶額外的信息,它僅僅是用作兩個goroutine之間的同步,這時候我們可以用 struct{} 空結(jié)構(gòu)體作為channels元素的類型。用來通知子協(xié)程(goroutine)執(zhí)行任務(wù),或只用來控制協(xié)程并發(fā)度。
在部分場景下,結(jié)構(gòu)體只包含方法,不包含任何的字段。這時候我們就可以使用空結(jié)構(gòu)體。
其實,上面的calculateInt 可以是任何類型,如 type calculateInt bool ,但是struct{}不占用任何空間,邏輯上也更合理,因此還是它最好。
golang 新人求助 關(guān)于格式占位符的問題
靜態(tài)編譯后只生成單個文件。實現(xiàn)小型和工具型程序不需依賴,易于分享。
直接編譯為exe等可執(zhí)行文件,不用像PyQt、Electron那樣再打包。
跨平臺編譯能力,同時支持多個跨平臺庫。
并發(fā)優(yōu)化,協(xié)程支持,開發(fā)多線程GUI程序,比Python效率更優(yōu)。
語言簡單,開發(fā)難度較C++小。
基礎(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 進行寬度填充而不用空格,對于數(shù)值類型,符號將被移到所有 0 的前面。
其中 "0" 和 "-" 不能同時使用,優(yōu)先使用 "-" 而忽略 "0"。
【寬度和精度】
“寬度”和“精度”都可以寫成以下三種形式:
數(shù)值 | * | arg索引*
其中“數(shù)值”表示使用指定的數(shù)值作為寬度值或精度值,“ ”表示使用當(dāng)前正在處理的 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉(zhuǎn)到下一個。“arg索引 ”表示使用指定 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 進制格式
x/X :輸出 16 進制格式(小寫/大寫)
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:十六進制編碼(小寫/大寫,以字節(jié)為元素進行編碼,而不是字符)
對于 q:
如果使用了 "+" 旗標(biāo),則將所有非 ASCII 字符都進行轉(zhuǎn)義處理。
如果使用了 "#" 旗標(biāo),則輸出反引號引起來的字符串(前提是
字符串中不包含任何制表符以外的控制字符,否則忽略 # 旗標(biāo))
對于 x/X:
如果使用了 " " 旗標(biāo),則在每個元素之間添加空格。
如果使用了 "#" 旗標(biāo),則在十六進制格式之前添加 0x 前綴。
[指針類型]
p :帶 0x 前綴的十六進制地址值。
[符合類型]
復(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 的八進制或十六進制數(shù)值。
寬度被用來指定最大掃描寬度(不會跨越空格),精度不被支持。
如果 arg 實現(xiàn)了 Scanner 接口,將調(diào)用它的 Scan 方法掃描相應(yīng)數(shù)據(jù)。只有基礎(chǔ)類型和實現(xiàn)了 Scanner 接口的類型可以使用 Scan 類方法進行掃描。
【注意】
連續(xù)調(diào)用 FScan 可能會丟失數(shù)據(jù),因為 FScan 中使用了 UnreadRune 對讀取的數(shù)據(jù)進行撤銷,而參數(shù) io.Reader 只有 Read 方法,不支持撤銷。比如:
Go語言輸出打印--排坑
一.幾種公共方法
1)Print:???輸出到控制臺(不接受任何格式化,它等價于對每一個操作數(shù)都應(yīng)用?%v)
print 在golang中?是屬于輸出到標(biāo)準(zhǔn)錯誤流中并打印,官方不建議寫程序時候用它。可以再debug時候用
2)Println:?輸出到控制臺并換行
3)Printf :?只可以打印出格式化的字符串。只可以直接輸出字符串類型的變量(不可以輸出整形變量和整形等)
4)Sprintf:格式化并返回一個字符串而不帶任何輸出
5)Fprintf:來格式化并輸出到 io.Writers 而不是 os.Stdout
二.帶占位符輸出--網(wǎng)址:? ??
和python差不多的道理,這里簡單補充
v ????值的默認(rèn)格式
%+v???添加字段名(如結(jié)構(gòu)體)
%#v ?相應(yīng)值的Go語法表示?
%T????相應(yīng)值的類型的Go語法表示?
%%????字面上的百分號,并非值的占位符
%c?????相應(yīng)Unicode碼點所表示的字符?
%x?????十六進制表示,字母形式為小寫 a-f
%X?????十六進制表示,字母形式為大寫 A-F
%U???? Unicode格式:U+1234,等同于?"U+%04X"
名稱欄目:go語言占位符 golang 位操作
分享地址:http://ef60e0e.cn/article/hhsssh.html