完整的一條json語(yǔ)句中,字段都為字符串類(lèi)型,值為基本數(shù)據(jù)類(lèi)型:整形、布爾型、字符串等
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),根河企業(yè)網(wǎng)站建設(shè),根河品牌網(wǎng)站建設(shè),網(wǎng)站定制,根河網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,根河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
在解析json時(shí),通常要用到encoding/json這個(gè)包
json.Unmarshal()方法用作將一個(gè)json類(lèi)型的字節(jié)流,序列化成指定的形式,可以為map,也可以為自定義的結(jié)構(gòu)體,需要注意的是,希望被轉(zhuǎn)換的格式需要以指針類(lèi)型傳入
運(yùn)行結(jié)果如下
將map或者struct打包成json,用的是json中的marshal方法,返回的是一個(gè)字節(jié)數(shù)組和一個(gè)錯(cuò)誤類(lèi)型
打印結(jié)果
數(shù)組是一個(gè)由 固定長(zhǎng)度 的 特定類(lèi)型元素 組成的序列,一個(gè)數(shù)組可以由零個(gè)或多個(gè)元素組成。 數(shù)組是值類(lèi)型
數(shù)組的每個(gè)元素都可以通過(guò)索引下標(biāo)來(lái)訪問(wèn),索引下標(biāo)的范圍是從0開(kāi)始到數(shù)組長(zhǎng)度減1的位置,內(nèi)置函數(shù) len() 可以返回?cái)?shù)組中元素的個(gè)數(shù)。
2.類(lèi)型的打印,結(jié)果的第二種打印方式
3.對(duì)元素的修改或者賦值
4.判斷數(shù)組是否相等:長(zhǎng)度、類(lèi)型
4.數(shù)組的地址:連續(xù)存儲(chǔ)的空間
5.數(shù)組的賦值、地址、取值
6.數(shù)組的默認(rèn)值
7.數(shù)組的初始化
8.數(shù)組的逆置
9.求數(shù)組的最大值、最小值、平均值
10.對(duì)數(shù)組字符串進(jìn)行連接
11.冒泡排序法的實(shí)現(xiàn)
12.數(shù)組做函數(shù)的參數(shù)
13.二維數(shù)組:賦值和地址
14.二維數(shù)組:打印和輸出
15. 指針數(shù)組,每一個(gè)元素都是地址
17.數(shù)組的內(nèi)存分配
命令如下:
直接在終端中輸入gohelp即可顯示所有的go命令以及相應(yīng)命令功能簡(jiǎn)介,主要有下面這些:
build:編譯包和依賴(lài);clean:移除對(duì)象文件;doc:顯示包或者符號(hào)的文檔;env:打印go的環(huán)境信息;bug:啟動(dòng)錯(cuò)誤報(bào)告;fix:運(yùn)行g(shù)otoolfix;fmt:運(yùn)行g(shù)ofmt進(jìn)行格式化;generate:從processingsource生成go文件
get:下載并安裝包和依賴(lài);install:編譯并安裝包和依賴(lài);list:列出包;run:編譯并運(yùn)行g(shù)o程序;test:運(yùn)行測(cè)試;tool:運(yùn)行g(shù)o提供的工具;version:顯示go的版本;vet:運(yùn)行g(shù)otoolvet;命令的使用方式為:gocommand[args],除此之外,可以使用gohelp;來(lái)顯示指定命令的更多幫助信息。;在運(yùn)行g(shù)ohelp時(shí),不僅僅打印了這些命令的基本信息,還給出了一些概念的幫助信息:;c:Go和c的相互調(diào)用;buildmode:構(gòu)建模式的描述;filetype:文件類(lèi)型;gopath:GOPATH環(huán)境變量
environment:環(huán)境變量;importpath:導(dǎo)入路徑語(yǔ)法;packages:包列表的描述;testflag:測(cè)試符號(hào)描述;testfunc:測(cè)試函數(shù)描述等。
本教程介紹了 Go 中模糊測(cè)試的基礎(chǔ)知識(shí)。通過(guò)模糊測(cè)試,隨機(jī)數(shù)據(jù)會(huì)針對(duì)您的測(cè)試運(yùn)行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎???梢酝ㄟ^(guò)模糊測(cè)試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點(diǎn)腳本攻擊。
在本教程中,您將為一個(gè)簡(jiǎn)單的函數(shù)編寫(xiě)一個(gè)模糊測(cè)試,運(yùn)行 go 命令,并調(diào)試和修復(fù)代碼中的問(wèn)題。
首先,為您要編寫(xiě)的代碼創(chuàng)建一個(gè)文件夾。
1、打開(kāi)命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 fuzz 的目錄。
3、創(chuàng)建一個(gè)模塊來(lái)保存您的代碼。
運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。
接下來(lái),您將添加一些簡(jiǎn)單的代碼來(lái)反轉(zhuǎn)字符串,稍后我們將對(duì)其進(jìn)行模糊測(cè)試。
在此步驟中,您將添加一個(gè)函數(shù)來(lái)反轉(zhuǎn)字符串。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 main.go 的文件。
獨(dú)立程序(與庫(kù)相反)始終位于 package 中main。
此函數(shù)將接受string,使用byte進(jìn)行循環(huán) ,并在最后返回反轉(zhuǎn)的字符串。
此函數(shù)將運(yùn)行一些Reverse操作,然后將輸出打印到命令行。這有助于查看運(yùn)行中的代碼,并可能有助于調(diào)試。
e.該main函數(shù)使用 fmt 包,因此您需要導(dǎo)入它。
第一行代碼應(yīng)如下所示:
從包含 main.go 的目錄中的命令行,運(yùn)行代碼。
可以看到原來(lái)的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當(dāng)于原來(lái)的了。
現(xiàn)在代碼正在運(yùn)行,是時(shí)候測(cè)試它了。
在這一步中,您將為Reverse函數(shù)編寫(xiě)一個(gè)基本的單元測(cè)試。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 reverse_test.go 的文件。
b.將以下代碼粘貼到 reverse_test.go 中。
這個(gè)簡(jiǎn)單的測(cè)試將斷言列出的輸入字符串將被正確反轉(zhuǎn)。
使用運(yùn)行單元測(cè)試go test
接下來(lái),您將單元測(cè)試更改為模糊測(cè)試。
單元測(cè)試有局限性,即每個(gè)輸入都必須由開(kāi)發(fā)人員添加到測(cè)試中。模糊測(cè)試的一個(gè)好處是它可以為您的代碼提供輸入,并且可以識(shí)別您提出的測(cè)試用例沒(méi)有達(dá)到的邊緣用例。
在本節(jié)中,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,這樣您就可以用更少的工作生成更多的輸入!
請(qǐng)注意,您可以將單元測(cè)試、基準(zhǔn)測(cè)試和模糊測(cè)試保存在同一個(gè) *_test.go 文件中,但對(duì)于本示例,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試。
在您的文本編輯器中,將 reverse_test.go 中的單元測(cè)試替換為以下模糊測(cè)試。
Fuzzing 也有一些限制。在您的單元測(cè)試中,您可以預(yù)測(cè)Reverse函數(shù)的預(yù)期輸出,并驗(yàn)證實(shí)際輸出是否滿(mǎn)足這些預(yù)期。
例如,在測(cè)試用例Reverse("Hello, world")中,單元測(cè)試將返回指定為"dlrow ,olleH".
模糊測(cè)試時(shí),您無(wú)法預(yù)測(cè)預(yù)期輸出,因?yàn)槟鸁o(wú)法控制輸入。
但是,Reverse您可以在模糊測(cè)試中驗(yàn)證函數(shù)的一些屬性。在這個(gè)模糊測(cè)試中檢查的兩個(gè)屬性是:
(1)將字符串反轉(zhuǎn)兩次保留原始值
(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。
注意單元測(cè)試和模糊測(cè)試之間的語(yǔ)法差異:
(3)確保新包unicode/utf8已導(dǎo)入。
隨著單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,是時(shí)候再次運(yùn)行測(cè)試了。
a.在不進(jìn)行模糊測(cè)試的情況下運(yùn)行模糊測(cè)試,以確保種子輸入通過(guò)。
如果您在該文件中有其他測(cè)試,您也可以運(yùn)行g(shù)o test -run=FuzzReverse,并且您只想運(yùn)行模糊測(cè)試。
b.運(yùn)行FuzzReverse模糊測(cè)試,查看是否有任何隨機(jī)生成的字符串輸入會(huì)導(dǎo)致失敗。這是使用go test新標(biāo)志-fuzz執(zhí)行的。
模糊測(cè)試時(shí)發(fā)生故障,導(dǎo)致問(wèn)題的輸入被寫(xiě)入將在下次運(yùn)行的種子語(yǔ)料庫(kù)文件中g(shù)o test,即使沒(méi)有-fuzz標(biāo)志也是如此。要查看導(dǎo)致失敗的輸入,請(qǐng)?jiān)谖谋揪庉嬈髦写蜷_(kāi)寫(xiě)入 testdata/fuzz/FuzzReverse 目錄的語(yǔ)料庫(kù)文件。您的種子語(yǔ)料庫(kù)文件可能包含不同的字符串,但格式相同。
語(yǔ)料庫(kù)文件的第一行表示編碼版本。以下每一行代表構(gòu)成語(yǔ)料庫(kù)條目的每種類(lèi)型的值。由于 fuzz target 只需要 1 個(gè)輸入,因此版本之后只有 1 個(gè)值。
c.運(yùn)行沒(méi)有-fuzz標(biāo)志的go test; 新的失敗種子語(yǔ)料庫(kù)條目將被使用:
由于我們的測(cè)試失敗,是時(shí)候調(diào)試了。
一.幾種公共方法
1)Print:???輸出到控制臺(tái)(不接受任何格式化,它等價(jià)于對(duì)每一個(gè)操作數(shù)都應(yīng)用?%v)
print 在golang中?是屬于輸出到標(biāo)準(zhǔn)錯(cuò)誤流中并打印,官方不建議寫(xiě)程序時(shí)候用它??梢栽賒ebug時(shí)候用
2)Println:?輸出到控制臺(tái)并換行
3)Printf :?只可以打印出格式化的字符串。只可以直接輸出字符串類(lèi)型的變量(不可以輸出整形變量和整形等)
4)Sprintf:格式化并返回一個(gè)字符串而不帶任何輸出
5)Fprintf:來(lái)格式化并輸出到 io.Writers 而不是 os.Stdout
二.帶占位符輸出--網(wǎng)址:? ??
和python差不多的道理,這里簡(jiǎn)單補(bǔ)充
v ????值的默認(rèn)格式
%+v???添加字段名(如結(jié)構(gòu)體)
%#v ?相應(yīng)值的Go語(yǔ)法表示?
%T????相應(yīng)值的類(lèi)型的Go語(yǔ)法表示?
%%????字面上的百分號(hào),并非值的占位符
%c?????相應(yīng)Unicode碼點(diǎn)所表示的字符?
%x?????十六進(jìn)制表示,字母形式為小寫(xiě) a-f
%X?????十六進(jìn)制表示,字母形式為大寫(xiě) A-F
%U???? Unicode格式:U+1234,等同于?"U+%04X"