GOREPLAY原始碼解析之命令列引數

2021-09-02 21:08:33 字數 1408 閱讀 3246

[size=medium][b]環境與編譯[/b][/size]

[size=medium][b]命令列引數[/b][/size]

goreplay支援很多種命令列引數。具體支援的命令列引數可以goreplay --help來檢視,我們主要使用goreplay**http,通常命令為:

goreplay --input-raw :8080 --output-tcp 10.60.20.8:8080

意思就是監聽本機的8080埠,把8080埠上的資料報文**到10.60.20.8:8080。

goreplay是如何處理這些命令列引數的?首先從程式的入口說起,go語言應用的預設入口在main函式。即在gor.go檔案中。但go除了在package main裡的main是入口函式之外,還保留了另乙個入口,即在任意package中的init函式。如setting.go中的init函式,該函式會在程式啟動時甚至先於main執行。go的函式以及變數的初始化,可以深入讀讀,這裡面有比較深的門路,不深入展開(真實的原因是現在我也不太熟^_^)。

go有乙個命令列引數的處理模組,叫flag,使用的過程可以通過乙個樣例程式大概了解:

package main

import (

"flag"

"fmt"

)func main()

執行 args.exe -src="123" -level=4 -memo="567",輸出如下:

usage of args.exe:

-level int

debug level

-memo string

the memory

-src string

source file

src=123, level=4, memo=567

大概的過程就是先繫結命令列上的key,parse時就真正的value取出到指定變數上。

繼續加來goreplay原始碼,執行完setting.go裡的init函式之後,即把命令列key與變更繫結,在main函式中的flag.parse()之後,即解析到setting的變數中,隨後initplugins完成根據命令列指定引數模組的初始化載入。當前命令行為:

goreplay --input-raw :8080 --output-tcp 10.60.20.8:8080

即input_raw.go以及output_tcp.go會初始化載入,初始化過程也是挺多go的api的,有一些我也沒有非常了解,類似一些反射之類的,還需要繼續深入,但goreplay的命令列引數對程式執行影響大體的流程以及意義就像上面所說的了。後續我們要改造goreplay時,就知道如何增加命令列引數,並且增加對應的**模組。

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

原始碼解析 JDK原始碼之LinkedHashMap

linkedhashmap原始碼,基於 jdk1.6.43 他繼承了hashmap,並且實現了插入和訪問的有序功能 public class linkedhashmapextends hashmapimplements map 其也有乙個entry內部類,繼承了 hashmap 的entry 內部類...

hive原始碼解析之語法解析

hive語法解析器是根據 上次分享的 詞法分析 生成的語法樹為基礎,進行語法解析。根據語法token的情況實現了五個具體的語法解析器。在你生成語法器的時候,semanticanalyze ctory分別針對不同的情況生成對應的某個語法器,如下 semanticanalyze ctory類 現在有五個...