免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

go語言testing go語言為什么突然火了

如何看待go語言泛型的最新設計?

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現實。Go 團隊實施了一個看起來比較穩定的設計草案,并且正以源到源翻譯器原型的形式獲得關注。本文講述的是泛型的最新設計,以及如何自己嘗試泛型。

創新互聯建站主營清豐網站建設的網絡公司,主營網站建設方案,APP應用開發,清豐h5重慶小程序開發搭建,清豐網站營銷推廣歡迎清豐等地區企業咨詢

例子

FIFO Stack

假設你要創建一個先進先出堆棧。沒有泛型,你可能會這樣實現:

type?Stack?[]interface{}func?(s?Stack)?Peek()?interface{}?{

return?s[len(s)-1]

}

func?(s?*Stack)?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack)?Push(value?interface{})?{

*s?=?

append(*s,?value)

}

但是,這里存在一個問題:每當你 Peek 項時,都必須使用類型斷言將其從 interface{} 轉換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發現到自己的錯誤,直到它影響到你的整個服務為止。

通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因為可以在編譯時而不是運行時發現問題。

泛型通過允許類型具有類型參數來解決此問題:

type?Stack(type?T)?[]Tfunc?(s?Stack(T))?Peek()?T?{

return?s[len(s)-1]

}

func?(s?*Stack(T))?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack(T))?Push(value?T)?{

*s?=?

append(*s,?value)

}

這會向 Stack 添加一個類型參數,從而完全不需要 interface{}。現在,當你使用 Peek() 時,返回的值已經是原始類型,并且沒有機會返回錯誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)

此外,泛型代碼通常更易于編譯器優化,從而獲得更好的性能(以二進制大小為代價)。如果我們對上面的非泛型代碼和泛型代碼進行基準測試,我們可以看到區別:

type?MyObject?struct?{

X?

int

}

var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek().(MyObject)

}

}

func?BenchmarkGo2(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack(MyObject)

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek()

}

}

結果:

BenchmarkGo1BenchmarkGo1-16?????12837528?????????87.0?ns/op???????48?B/op????????2?allocs/opBenchmarkGo2BenchmarkGo2-16?????28406479?????????41.9?ns/op???????24?B/op????????2?allocs/op

在這種情況下,我們分配更少的內存,同時泛型的速度是非泛型的兩倍。

合約(Contracts)

上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實現 String() 函數

微機test函數作用

Go語言自帶了 testing 測試包,可以進行自動化的單元測試,輸出結果驗證,并且可以測試性能。

為什么需要測試

完善的測試體系,能夠提高開發的效率,當項目足夠復雜的時候,想要保證盡可能的減少 bug,有兩種有效的方式分別是代碼審核和測試,Go語言中提供了 testing 包來實現單元測試功能。

測試規則

要開始一個單元測試,需要準備一個 go 源碼文件,在命名文件時文件名必須以_test.go結尾,單元測試源碼文件可以由多個測試用例(可以理解為函數)組成,每個測試用例的名稱需要以 Test 為前綴,例如:

func TestXxx( t *testing.T ){

//......

}

GO語言(二十九):模糊測試(下)-

語料庫文件以特殊格式編碼。這是種子語料庫和生成語料庫的相同格式。

下面是一個語料庫文件的例子:

第一行用于通知模糊引擎文件的編碼版本。雖然目前沒有計劃未來版本的編碼格式,但設計必須支持這種可能性。

下面的每一行都是構成語料庫條目的值,如果需要,可以直接復制到 Go 代碼中。

在上面的示例中,我們在 a []byte后跟一個int64。這些類型必須按順序與模糊測試參數完全匹配。這些類型的模糊目標如下所示:

指定您自己的種子語料庫值的最簡單方法是使用該 (*testing.F).Add方法。在上面的示例中,它看起來像這樣:

但是,您可能有較大的二進制文件,您不希望將其作為代碼復制到您的測試中,而是作為單獨的種子語料庫條目保留在 testdata/fuzz/{FuzzTestName} 目錄中。golang.org/x/tools/cmd/file2fuzz 上的file2fuzz工具可用于將這些二進制文件轉換為為[]byte.

要使用此工具:

語料庫條目:語料庫 中的一個輸入,可以在模糊測試時使用。這可以是特殊格式的文件,也可以是對 (*testing.F).Add。

覆蓋指導: 一種模糊測試方法,它使用代碼覆蓋范圍的擴展來確定哪些語料庫條目值得保留以備將來使用。

失敗的輸入:失敗的輸入是一個語料庫條目,當針對 模糊目標運行時會導致錯誤或恐慌。

fuzz target: 模糊測試的目標功能,在模糊測試時對語料庫條目和生成的值執行。它通過將函數傳遞給 (*testing.F).Fuzz實現。

fuzz test: 測試文件中的一個被命名為func FuzzXxx(*testing.F)的函數,可用于模糊測試。

fuzzing: 一種自動化測試,它不斷地操縱程序的輸入,以發現代碼可能容易受到的錯誤或漏洞等問題。

fuzzing arguments: 將傳遞給 模糊測試目標的參數,并由mutator進行變異。

fuzzing engine: 一個管理fuzzing的工具,包括維護語料庫、調用mutator、識別新的覆蓋率和報告失敗。

生成的語料庫: 由模糊引擎隨時間維護的語料庫,同時模糊測試以跟蹤進度。它存儲在$GOCACHE/fuzz 中。這些條目僅在模糊測試時使用。

mutator: 一種在模糊測試時使用的工具,它在將語料庫條目傳遞給模糊目標之前隨機操作它們。

package: 同一目錄下編譯在一起的源文件的集合。

種子語料庫: 用戶提供的用于模糊測試的語料庫,可用于指導模糊引擎。它由 f.Add 在模糊測試中調用提供的語料庫條目以及包內 testdata/fuzz/{FuzzTestName} 目錄中的文件組成。這些條目默認使用go test運行,無論是否進行模糊測試。

測試文件: 格式為 xxx_test.go 的文件,可能包含測試、基準、示例和模糊測試。

漏洞: 代碼中的安全敏感漏洞,可以被攻擊者利用。

windows 怎么編譯 go語言

1、解壓壓縮包到go工作目錄,如解壓到E:\opensource\go\go,解壓后的目錄結構如下:

E:\opensource\go\go

├─api

├─bin

│ ├─go.exe

│ ├─godoc.exe

│ └─gofmt.exe

├─doc

├─include

├─lib

├─misc

├─pkg

├─src

└─test

2、增加環境變量GOROOT,取值為上面的go工作目錄

3、Path環境變量中添加";%GOROOT%\bin",以便能夠直接調用go命令來編譯go代碼,至此go編譯環境就配置好了

注:如果不想手動設置系統環境變量,也可下載go啟動環境批處理附件,

修改goenv.bat文件中的GOROOT值為上面的go工作目錄后直接雙擊該bat文件,go編譯環境變量即設置完成。

4、測試go編譯環境,啟動一個cmd窗口,直接輸入go,看到下面的提示就是搭建成功了

E:\opensource\go\gogo

Go is a tool for managing Go source code.

Usage:

go command [arguments]

The commands are:

build compile packages and dependencies

clean remove object files

doc run godoc on package sources

env print Go environment information

fix run go tool fix on packages

fmt run gofmt on package sources

get download and install packages and dependencies

install compile and install packages and dependencies

list list packages

run compile and run Go program

test test packages

tool run specified go tool

version print Go version

vet run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

gopath GOPATH environment variable

packages description of package lists

remote remote import path syntax

testflag description of testing flags

testfunc description of testing functions

Use "go help [topic]" for more information about that topic.

5、編譯helloworld測試程序,go語言包中test目錄帶有helloworld.go測試程序,源碼見"附一 helloworld.go",

直接調用"go build helloworld.go"就生成了"helloworld.exe"可執行程序,運行一下這個程序看到了我們期望的hello,wolrd。

E:\opensource\go\go\testgo build helloworld.go

E:\opensource\go\go\testhelloworld.exe

hello, world

E:\opensource\go\go\test

附一 helloworld.go

// cmpout

// Copyright 2009 The Go Authors. All rights reserved.

// Use of this source code is governed by a BSD-style

// license that can be found in the LICENSE file.

// Test that we can do page 1 of the C book.

package main

func main() {

print("hello, world\n")

}

Go 是怎么使用 Go 來編譯自身的

是Go語言嗎?

Go 編譯過程 九個步驟

第一步. all.bash

%?cd?$GOROOT/src

%?./all.bash

第一步 all.bash?只是調用了另外兩個 shell 腳本:make.bash?和run.bash。若使用 Windows 或 Plan 9,其過程也基本類似,只是腳本分別以 .bat 或 .rc 結尾。在文章的其他部分,請用適當的操作系統對應的擴展來補全命令。

第二步. make.bash

.?./make.bash?--no-banner

make.bash 作為 all.bash 內容的一部分,如果它退出也會中斷構建過程

第三步. cmd/dist

gcc?-O2?-Wall?-Werror?-ggdb?-o?cmd/dist/dist?-Icmd/dist?cmd/dist/*.c

當健全檢查完成后,make.bash 開始編譯?cmd/dist。

第四步. go_bootstrap

現在 go_bootstrap 已經構建完成,make.bash 的最后一步是使用 go_bootstrap 編譯完整的 Go 標準庫,包括一個完整的 go 工具用以替換。

echo?"#?Building?packages?and?commands?for?$GOOS/$GOARCH."

"$GOTOOLDIR"/go_bootstrap?install?-gcflags?"$GO_GCFLAGS"?\

-ldflags?"$GO_LDFLAGS"?-v?std

第五步. run.bash

現在 make.bash 已經完成,回到 all.bash 的執行,這會調用 run.bash。run.bash 的任務是編譯和測試標準庫、運行時以及語言測試集。

bash?run.bash?--no-rebuild

由于 make.bash 和 run.bash 都會調用 go install -a std,因此需要使用 –no-rebuild 標志來避免重復前面的步驟,–no-rebuild 跳過了第二個 go install。

#?allow?all.bash?to?avoid?double-build?of?everythingrebuild=trueif?[?"$1"?=?"--no-rebuild"?];?then?shiftelse?echo?'#?Building?packages?and?commands.'?time?go?install?-a?-v?std?echofi

第六步. go test -a std

echo?'#?Testing?packages.'

time?go?test?std?-short?-timeout=$(expr?120?\*?$timeout_scale)s

echo

接下來 run.bash 會在標準庫里所有的包上來運行用 testing 包編寫的單元測試。由于 $GOPATH 和 $GOROOT 中有著相同的命名空間,所以不能直接使用 go test … 否則 $GOPATH 中的每個包也會被逐一測試,因此創建了一個用于標準庫中的包的別名:std。由于一些測試需要比較長的時間,且會消耗大量內存,因此用 -short 標志對一些測試進行了過濾。

第七步. runtime 和 cgo 測試

run.bash 接下來的部分會運行平臺對 cgo 支持的測試,執行一些性能測試,并且編譯一些伴隨 Go 發行版一起的雜項程序。隨著時間的流逝,這些雜項程序的清單會越來越長,那么它們也就會不可避免的被從編譯過程中悄悄剝離出去。

第八步. go run test

(xcd?../test

unset?GOMAXPROCS

time?go?run?run.go

)?||?exit?$?

run.bash 的倒數第二步會調用在 $GOROOT 下的 test 目錄里的編譯器和運行時的測試。他們是對于編譯器和運行時自身的,較為低級細節的測試。會執行語言規格測試,test/bugs 和 test/fixedbugs 子目錄保存有那些已經被發現并被修復的問題的獨立的測試。驅動測試的是一個小 Go 程序 $GOROOT/test/run.go,會執行 test 目錄里的每個 .go 文件。一些 .go 文件的首行包含了指導 run.go 對結果作出判斷的指令,例如,程序將會失敗,或提供一個確定的輸出隊列。

第九步. go tool api

echo?'#?Checking?API?compatibility.'

go?tool?api?-c?$GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt?\

-next?$GOROOT/api/next.txt?-except?$GOROOT/api/except.txt

run.bash 的最后一步調用了 api 工具。

怎么學習golang

除了Java、Python和JavaScript之外,如果要開始學習一門新語言的話,我想應該是Go!

Go語言正在被越來越多的公司使用。我們公司的后端服務已經全面采用Go語言實現了。

最開始接觸Go語言是去年將一份Go代碼“翻譯”成Python并集成到測試平臺上,說來也挺神奇,我從來沒學過Go卻完成了這個工作,這也側面反應了Go的語法還是很平易近人的。

今年,在海翔飛調崗之后已經沒有太多時間寫代碼了,但如果要開始學習一個新的語言或技術的話,我最想學的是Go!

目前來看,Go似乎還并沒有太多測試人員使用的場景,不過,我之前介紹過的BDD行為驅動框架gauge是由Go開發的,當然,它也支持使用Go來編寫BDD測試代碼。

對于,已經有一定開發經驗的同學,如何快速的開始學習Go語言呢?我這里給一些思路。

#### 第一步:下載和安裝

在配置環境的時候你需要重點了解GOROOT、GOPATH的作用。

你還要準備一款稱手的編輯器,如果你像我一樣,一直都在使用VS Code的話,那么就它就可以了。

#### 第二步:從hello world開始

先運行一個hello world程序,認識Go語言的語法。

package main

import ( ? ?"fmt")

func main(){

fmt.Println("helloworld!")

}

#### 第三步:熟悉Go的語法

接下來,你可能要花一周左右的時間熟悉Go語言的語法。比如,變量定義、if/for、函數、Map、跨文件的程序調用…等,當然,還有一些Go特有的知識。

當然,我更喜歡看視頻教程,雖然質量參差不齊,但我仍然覺得看視頻比我自己看書更有效率。

熟悉一段Go代碼:

package main

import"fmt"

func myFunc() {

i := 0

Here: ? //這行的第一個詞,以冒號結束作為標簽

fmt.Println(i)

i++ ? ?if i 10{ ? ? ? ?goto Here ? //跳轉到Here去

}

}func main() { ? ?//調用函數

myFunc()

}

#### 第四步:Go如何做單元測試

針對Go做測試也非常簡單。比如,這是一個被測試文件:add.go。

package test_demofunc Add(a int, b int) int{ ? ?return a + b

}

下面針對Add()函數編寫測試用例,test_add.go

package test_demo

import ( ? ?"testing")

func TestAdd1(t *testing.T){

r:= Add(1, 2) ? ?if r !=3{

t.Errorf("Add(1, 2)failed. Got %d, expected 3.", r)

}

}

func TestAdd2(t *testing.T){

r:= Add(2, 2) ? ?if r !=4{

t.Errorf("Add(2, 2)failed. Got %d, expected 4.", r)

}

}

你只需要執行?go test?命令就可以運行上面的測試了。

#### 第五步:從哪兒找第三方庫

當然,你只學習go語言本身,基本是做不了什么事的,必須要使用第三方擴展庫。

這里羅列了Go語言的第三方庫,通過這些第三方庫的介紹,我們也可以大概知道Go可以用來干什么。

如果你知道庫的名字的話,也可以在這個網站上搜索。

據我了解,Go的第三方庫大多都在GitHub上面。

#### 第六步:用Go做Web開發

Go是靜態語言,而且支持并發編程,所以,他有天然的性能優勢,大多公司主要使用Go也是開發后端服務(即API)。

終于到了實戰階段,如果我們真的要掌握一門語言,那么一定要用它來開發一個項目出來。這個過程大概需要一個月。

Beego是Go下在主流的Web開發框架,資料相對比較豐富,而且有完善的文檔。你可為此制定一個目標,比如用它來開發一個Blog,為此,你需要詳細閱讀Beego文檔,以及學習相關的Web開發技術。

等你完成這個項目的時候,我想你已經會使用Go語言了。

當前題目:go語言testing go語言為什么突然火了
標題URL:http://m.newbst.com/article18/hjpcgp.html

成都網站建設公司_創新互聯,為您提供云服務器ChatGPT網站建設品牌網站建設標簽優化企業建站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

手機網站建設