go語言ip地址處理函數(shù) go 獲取本機(jī)ip

Go語言事件請(qǐng)求處理程序(Event Handler)

在Go語言的代碼中,您需要引入官方的SDK庫(kù) aliyun/serverless/fc-runtime-go-sdk/fc,并實(shí)現(xiàn)handler函數(shù)和main函數(shù)。 示例如下:

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的道外網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

傳入的event參數(shù)是一個(gè)包含key屬性的JSON字符串,示例如下。

具體的示例解析如下:

有效的Event Handler簽名如下:

其中,InputType和OutputType與encoding/json標(biāo)準(zhǔn)庫(kù)兼容。

Event Handler的使用需遵循以下規(guī)則:

事件函數(shù)的Handler示例代碼:

GO語言(十六):模糊測(cè)試入門(上)

本教程介紹了 Go 中模糊測(cè)試的基礎(chǔ)知識(shí)。通過模糊測(cè)試,隨機(jī)數(shù)據(jù)會(huì)針對(duì)您的測(cè)試運(yùn)行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎?。可以通過模糊測(cè)試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點(diǎn)腳本攻擊。

在本教程中,您將為一個(gè)簡(jiǎn)單的函數(shù)編寫一個(gè)模糊測(cè)試,運(yùn)行 go 命令,并調(diào)試和修復(fù)代碼中的問題。

首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。

1、打開命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 fuzz 的目錄。

3、創(chuàng)建一個(gè)模塊來保存您的代碼。

運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。

接下來,您將添加一些簡(jiǎn)單的代碼來反轉(zhuǎn)字符串,稍后我們將對(duì)其進(jìn)行模糊測(cè)試。

在此步驟中,您將添加一個(gè)函數(shù)來反轉(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)行代碼。

可以看到原來的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當(dāng)于原來的了。

現(xiàn)在代碼正在運(yùn)行,是時(shí)候測(cè)試它了。

在這一步中,您將為Reverse函數(shù)編寫一個(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

接下來,您將單元測(cè)試更改為模糊測(cè)試。

單元測(cè)試有局限性,即每個(gè)輸入都必須由開發(fā)人員添加到測(cè)試中。模糊測(cè)試的一個(gè)好處是它可以為您的代碼提供輸入,并且可以識(shí)別您提出的測(cè)試用例沒有達(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í)際輸出是否滿足這些預(yù)期。

例如,在測(cè)試用例Reverse("Hello, world")中,單元測(cè)試將返回指定為"dlrow ,olleH".

模糊測(cè)試時(shí),您無法預(yù)測(cè)預(yù)期輸出,因?yàn)槟鸁o法控制輸入。

但是,Reverse您可以在模糊測(cè)試中驗(yàn)證函數(shù)的一些屬性。在這個(gè)模糊測(cè)試中檢查的兩個(gè)屬性是:

(1)將字符串反轉(zhuǎn)兩次保留原始值

(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。

注意單元測(cè)試和模糊測(cè)試之間的語法差異:

(3)確保新包unicode/utf8已導(dǎo)入。

隨著單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,是時(shí)候再次運(yùn)行測(cè)試了。

a.在不進(jìn)行模糊測(cè)試的情況下運(yùn)行模糊測(cè)試,以確保種子輸入通過。

如果您在該文件中有其他測(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)致問題的輸入被寫入將在下次運(yùn)行的種子語料庫(kù)文件中g(shù)o test,即使沒有-fuzz標(biāo)志也是如此。要查看導(dǎo)致失敗的輸入,請(qǐng)?jiān)谖谋揪庉嬈髦写蜷_寫入 testdata/fuzz/FuzzReverse 目錄的語料庫(kù)文件。您的種子語料庫(kù)文件可能包含不同的字符串,但格式相同。

語料庫(kù)文件的第一行表示編碼版本。以下每一行代表構(gòu)成語料庫(kù)條目的每種類型的值。由于 fuzz target 只需要 1 個(gè)輸入,因此版本之后只有 1 個(gè)值。

c.運(yùn)行沒有-fuzz標(biāo)志的go test; 新的失敗種子語料庫(kù)條目將被使用:

由于我們的測(cè)試失敗,是時(shí)候調(diào)試了。

Go語言中怎么通過一個(gè)字符串調(diào)用對(duì)應(yīng)名稱的函數(shù)

按值傳遞函數(shù)參數(shù),是拷貝參數(shù)的實(shí)際值到函數(shù)的形式參數(shù)的方法調(diào)用。在這種情況下,參數(shù)在函數(shù)內(nèi)變化對(duì)參數(shù)不會(huì)有影響。

默認(rèn)情況下,Go編程語言使用調(diào)用通過值的方法來傳遞參數(shù)。在一般情況下,這意味著,在函數(shù)內(nèi)碼不能改變用來調(diào)用所述函數(shù)的參數(shù)??紤]函數(shù)swap()的定義如下。

代碼如下:

/* function definition to swap the values */

func swap(int x, int y) int {

var temp int

temp = x /* save the value of x */

x = y /* put y into x */

y = temp /* put temp into y */

return temp;

}

現(xiàn)在,讓我們通過使實(shí)際值作為在以下示例調(diào)用函數(shù)swap():

代碼如下:

package main

import "fmt"

func main() {

/* local variable definition */

var a int = 100

var b int = 200

fmt.Printf("Before swap, value of a : %d\n", a )

fmt.Printf("Before swap, value of b : %d\n", b )

/* calling a function to swap the values */

swap(a, b)

fmt.Printf("After swap, value of a : %d\n", a )

fmt.Printf("After swap, value of b : %d\n", b )

}

func swap(x, y int) int {

var temp int

temp = x /* save the value of x */

x = y /* put y into x */

y = temp /* put temp into y */

return temp;

}

讓我們把上面的代碼放在一個(gè)C文件,編譯并執(zhí)行它,它會(huì)產(chǎn)生以下結(jié)果:

Before swap, value of a :100

Before swap, value of b :200

After swap, value of a :100

After swap, value of b :200

這表明,參數(shù)值沒有被改變,雖然它們已經(jīng)在函數(shù)內(nèi)部改變。

通過傳遞函數(shù)參數(shù),即是拷貝參數(shù)的地址到形式參數(shù)的參考方法調(diào)用。在函數(shù)內(nèi)部,地址是訪問調(diào)用中使用的實(shí)際參數(shù)。這意味著,對(duì)參數(shù)的更改會(huì)影響傳遞的參數(shù)。

要通過引用傳遞的值,參數(shù)的指針被傳遞給函數(shù)就像任何其他的值。所以,相應(yīng)的,需要聲明函數(shù)的參數(shù)為指針類型如下面的函數(shù)swap(),它的交換兩個(gè)整型變量的值指向它的參數(shù)。

代碼如下:

/* function definition to swap the values */

func swap(x *int, y *int) {

var temp int

temp = *x /* save the value at address x */

*x = *y /* put y into x */

*y = temp /* put temp into y */

}

現(xiàn)在,讓我們調(diào)用函數(shù)swap()通過引用作為在下面的示例中傳遞數(shù)值:

代碼如下:

package main

import "fmt"

func main() {

/* local variable definition */

var a int = 100

var b int= 200

fmt.Printf("Before swap, value of a : %d\n", a )

fmt.Printf("Before swap, value of b : %d\n", b )

/* calling a function to swap the values.

* a indicates pointer to a ie. address of variable a and

* b indicates pointer to b ie. address of variable b.

*/

swap(a, b)

fmt.Printf("After swap, value of a : %d\n", a )

fmt.Printf("After swap, value of b : %d\n", b )

}

func swap(x *int, y *int) {

var temp int

temp = *x /* save the value at address x */

*x = *y /* put y into x */

*y = temp /* put temp into y */

}

讓我們把上面的代碼放在一個(gè)C文件,編譯并執(zhí)行它,它會(huì)產(chǎn)生以下結(jié)果:

Before swap, value of a :100

Before swap, value of b :200

After swap, value of a :200

After swap, value of b :100

這表明變化的功能以及不同于通過值調(diào)用的外部體現(xiàn)的改變不能反映函數(shù)之外。

Go語言實(shí)踐模式 - 函數(shù)選項(xiàng)模式(Functional Options Pattern)

大家好,我是小白,有點(diǎn)黑的那個(gè)白。

最近遇到一個(gè)問題,因?yàn)闃I(yè)務(wù)需求,需要對(duì)接第三方平臺(tái).

而三方平臺(tái)提供的一些HTTP(S)接口都有統(tǒng)一的密鑰生成規(guī)則要求.

為此我們封裝了一個(gè)獨(dú)立的包 xxx-go-sdk 以便維護(hù)和對(duì)接使用.

其中核心的部分是自定義HTTP Client,如下:

一些平臺(tái)會(huì)要求appKey/appSecret等信息,所以Client結(jié)構(gòu)體就變成了這樣,這時(shí)參數(shù)還比較少, 而且是必填的參數(shù),我們可以提供構(gòu)造函數(shù)來明確指定。

看起來很滿足,但是當(dāng)我們需要增加一個(gè) Timeout 參數(shù)來控制超時(shí)呢?

或許你會(huì)說這還不簡(jiǎn)單,像下面一樣再加一個(gè)參數(shù)唄

那再加些其他的參數(shù)呢?那構(gòu)造函數(shù)的參數(shù)是不是又長(zhǎng)又串,而且每個(gè)參數(shù)不一定是必須的,有些參數(shù)我們又會(huì)考慮默認(rèn)值的問題。

為此,勤勞但尚未致富的 gophers 們使用了總結(jié)一種實(shí)踐模式

首先提取所有需要的參數(shù)到一個(gè)獨(dú)立的結(jié)構(gòu)體 Options,當(dāng)然你也可以用 Configs 啥的.

然后為每個(gè)參數(shù)提供設(shè)置函數(shù)

這樣我們就為每個(gè)參數(shù)設(shè)置了獨(dú)立的設(shè)置函數(shù)。返回值 func(*Options) 看著有點(diǎn)不友好,我們提取下定義為單個(gè) Option 調(diào)整一下代碼

當(dāng)我們需要添加更多的參數(shù)時(shí),只需要在 Options 添加新的參數(shù)并添加新參數(shù)的設(shè)置函數(shù)即可。

比如現(xiàn)在要添加新的參數(shù) Timeout

這樣后續(xù)不管新增多少參數(shù),只需要新增配置項(xiàng)并添加獨(dú)立的設(shè)置函數(shù)即可輕松擴(kuò)展,并且不會(huì)影響原有函數(shù)的參數(shù)順序和個(gè)數(shù)位置等。

至此,每個(gè)選項(xiàng)是區(qū)分開來了,那么怎么作用到我們的 Client 結(jié)構(gòu)體上呢?

首先,配置選項(xiàng)都被提取到了 Options 結(jié)構(gòu)體重,所以我們需要調(diào)整一下 Client 結(jié)構(gòu)體的參數(shù)

其次,每一個(gè)選項(xiàng)函數(shù)返回 Option,那么任意多個(gè)就是 ...Option,我們調(diào)整一下構(gòu)造函數(shù) NewClient 的參數(shù)形式,改為可變參數(shù),不再局限于固定順序的幾個(gè)參數(shù)。

然后循環(huán)遍歷每個(gè)選項(xiàng)函數(shù),來生成Client結(jié)構(gòu)體的完整配置選項(xiàng)。

那么怎么調(diào)用呢?對(duì)于調(diào)用方而已,直接在調(diào)用構(gòu)造函數(shù)NewClient()的參數(shù)內(nèi)添加自己需要的設(shè)置函數(shù)(WithXXX)即可

當(dāng)需要設(shè)置超時(shí)參數(shù),直接添加 WithTimeout即可,比如設(shè)置3秒的超時(shí)

配置選項(xiàng)的位置可以任意設(shè)置,不需要受常規(guī)的固定參數(shù)順序約束。

可以看到,這種實(shí)踐模式主要作用于配置選項(xiàng),利用函數(shù)支持的特性來實(shí)現(xiàn)的,為此得名 Functional Options Pattern,優(yōu)美的中國(guó)話叫做「函數(shù)選項(xiàng)模式」。

最后, 我們總結(jié)回顧一下在Go語言中函數(shù)選項(xiàng)模式的優(yōu)缺點(diǎn)

Go語言設(shè)計(jì)與實(shí)現(xiàn)(上)

基本設(shè)計(jì)思路:

類型轉(zhuǎn)換、類型斷言、動(dòng)態(tài)派發(fā)。iface,eface。

反射對(duì)象具有的方法:

編譯優(yōu)化:

內(nèi)部實(shí)現(xiàn):

實(shí)現(xiàn) Context 接口有以下幾個(gè)類型(空實(shí)現(xiàn)就忽略了):

互斥鎖的控制邏輯:

設(shè)計(jì)思路:

(以上為寫被讀阻塞,下面是讀被寫阻塞)

總結(jié),讀寫鎖的設(shè)計(jì)還是非常巧妙的:

設(shè)計(jì)思路:

WaitGroup 有三個(gè)暴露的函數(shù):

部件:

設(shè)計(jì)思路:

結(jié)構(gòu):

Once 只暴露了一個(gè)方法:

實(shí)現(xiàn):

三個(gè)關(guān)鍵點(diǎn):

細(xì)節(jié):

讓多協(xié)程任務(wù)的開始執(zhí)行時(shí)間可控(按順序或歸一)。(Context 是控制結(jié)束時(shí)間)

設(shè)計(jì)思路: 通過一個(gè)鎖和內(nèi)置的 notifyList 隊(duì)列實(shí)現(xiàn),Wait() 會(huì)生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號(hào)通知一個(gè)(Signal())或所有(Boardcast())等待者(內(nèi)部實(shí)現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。

暴露四個(gè)函數(shù):

實(shí)現(xiàn)細(xì)節(jié):

部件:

包: golang.org/x/sync/errgroup

作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯(cuò)誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時(shí)就終止組內(nèi)各協(xié)程。

設(shè)計(jì)思路:

結(jié)構(gòu):

暴露的方法:

實(shí)現(xiàn)細(xì)節(jié):

注意問題:

包: "golang.org/x/sync/semaphore"

作用:排隊(duì)借資源(如錢,有借有還)的一種場(chǎng)景。此包相當(dāng)于對(duì)底層信號(hào)量的一種暴露。

設(shè)計(jì)思路:有一定數(shù)量的資源 Weight,每一個(gè) waiter 攜帶一個(gè) channel 和要借的數(shù)量 n。通過隊(duì)列排隊(duì)執(zhí)行借貸。

結(jié)構(gòu):

暴露方法:

細(xì)節(jié):

部件:

細(xì)節(jié):

包: "golang.org/x/sync/singleflight"

作用:防擊穿。瞬時(shí)的相同請(qǐng)求只調(diào)用一次,response 被所有相同請(qǐng)求共享。

設(shè)計(jì)思路:按請(qǐng)求的 key 分組(一個(gè) *call 是一個(gè)組,用 map 映射存儲(chǔ)組),每個(gè)組只進(jìn)行一次訪問,組內(nèi)每個(gè)協(xié)程會(huì)獲得對(duì)應(yīng)結(jié)果的一個(gè)拷貝。

結(jié)構(gòu):

邏輯:

細(xì)節(jié):

部件:

如有錯(cuò)誤,請(qǐng)批評(píng)指正。

當(dāng)前標(biāo)題:go語言ip地址處理函數(shù) go 獲取本機(jī)ip
當(dāng)前URL:http://www.muchs.cn/article26/docsicg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設(shè)計(jì)、微信公眾號(hào)、云服務(wù)器、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)