新聞中心
go語言可以做什么
1、服務(wù)器編程:以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數(shù)據(jù)打包、虛擬機處理、文件系統(tǒng)等。
濰城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,濰城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為濰城近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的濰城做網(wǎng)站的公司定做!
2、分布式系統(tǒng)、數(shù)據(jù)庫代理器、中間件:例如Etcd。
3、網(wǎng)絡(luò)編程:這一塊目前應(yīng)用最廣,包括Web應(yīng)用、API應(yīng)用、下載應(yīng)用,而且Go內(nèi)置的net/http包基本上把我們平常用到的網(wǎng)絡(luò)功能都實現(xiàn)了。
4、開發(fā)云平臺:目前國外很多云平臺在采用Go開發(fā),我們所熟知的七牛云、華為云等等都有使用Go進行開發(fā)并且開源的成型的產(chǎn)品。
5、區(qū)塊鏈:目前有一種說法,技術(shù)從業(yè)人員把Go語言稱作為區(qū)塊鏈行業(yè)的開發(fā)語言。如果大家學(xué)習(xí)區(qū)塊鏈技術(shù)的話,就會發(fā)現(xiàn)現(xiàn)在有很多很多的區(qū)塊鏈的系統(tǒng)和應(yīng)用都是采用Go進行開發(fā)的,比如ehtereum是目前知名度最大的公鏈,再比如fabric是目前最知名的聯(lián)盟鏈,兩者都有g(shù)o語言的版本,且go-ehtereum還是以太坊官方推薦的版本。
自1.0版發(fā)布以來,go語言引起了眾多開發(fā)者的關(guān)注,并得到了廣泛的應(yīng)用。go語言簡單、高效、并發(fā)的特點吸引了許多傳統(tǒng)的語言開發(fā)人員,其數(shù)量也在不斷增加。
使用 Go 語言開發(fā)的開源項目非常多。早期的 Go 語言開源項目只是通過 Go 語言與傳統(tǒng)項目進行C語言庫綁定實現(xiàn),例如 Qt、Sqlite 等。
后期的很多項目都使用 Go 語言進行重新原生實現(xiàn),這個過程相對于其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發(fā)項目的出現(xiàn)。
如何學(xué)習(xí)GO語言?
Go語言也稱 Golang,兼具效率、性能、安全、健壯等特性。這套Go語言教程(Golang教程)通俗易懂,深入淺出,既適合沒有基礎(chǔ)的讀者快速入門,也適合工作多年的程序員查閱知識點。
Go 語言
這套教程在講解一些知識點時,將 Go 語言和其他多種語言進行對比,讓掌握其它編程語言的讀者能迅速理解 Go 語言的特性。Go語言從底層原生支持并發(fā),無須第三方庫、開發(fā)者的編程技巧和開發(fā)經(jīng)驗就可以輕松搞定。
Go語言(或 Golang)起源于 2007 年,并在 2009 年正式對外發(fā)布。Go 是非常年輕的一門語言,它的主要目標(biāo)是“兼具 Python 等動態(tài)語言的開發(fā)速度和 C/C++ 等編譯型語言的性能與安全性”。
Go語言是編程語言設(shè)計的又一次嘗試,是對類C語言的重大改進,它不但能讓你訪問底層操作系統(tǒng),還提供了強大的網(wǎng)絡(luò)編程和并發(fā)編程支持。Go語言的用途眾多,可以進行網(wǎng)絡(luò)編程、系統(tǒng)編程、并發(fā)編程、分布式編程。
Go語言的推出,旨在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,具有“部署簡單、并發(fā)性好、語言設(shè)計良好、執(zhí)行性能好”等優(yōu)勢,目前國內(nèi)諸多 IT 公司均已采用Go語言開發(fā)項目。Go語言有時候被描述為“C 類似語言”,或者是“21 世紀(jì)的C語言”。Go 從C語言繼承了相似的表達式語法、控制流結(jié)構(gòu)、基礎(chǔ)數(shù)據(jù)類型、調(diào)用參數(shù)傳值、指針等很多思想,還有C語言一直所看中的編譯后機器碼的運行效率以及和現(xiàn)有操作系統(tǒng)的無縫適配。
因為Go語言沒有類和繼承的概念,所以它和 Java 或 C++ 看起來并不相同。但是它通過接口(interface)的概念來實現(xiàn)多態(tài)性。Go語言有一個清晰易懂的輕量級類型系統(tǒng),在類型之間也沒有層級之說。因此可以說Go語言是一門混合型的語言。
此外,很多重要的開源項目都是使用Go語言開發(fā)的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。Go 是編譯型語言,Go 使用編譯器來編譯代碼。編譯器將源代碼編譯成二進制(或字節(jié)碼)格式;在編譯代碼時,編譯器檢查錯誤、優(yōu)化性能并輸出可在不同平臺上運行的二進制文件。要創(chuàng)建并運行 Go 程序,程序員必須執(zhí)行如下步驟。
使用文本編輯器創(chuàng)建 Go 程序;
保存文件;編譯程序;運行編譯得到的可執(zhí)行文件。
這不同于 Python、Ruby 和 JavaScript 等語言,它們不包含編譯步驟。Go 自帶了編譯器,因此無須單獨安裝編譯器。
鏈喬教育在線旗下學(xué)碩創(chuàng)新區(qū)塊鏈技術(shù)工作站是中國教育部學(xué)校規(guī)劃建設(shè)發(fā)展中心開展的“智慧學(xué)習(xí)工場2020-學(xué)碩創(chuàng)新工作站 ”唯一獲準(zhǔn)的“區(qū)塊鏈技術(shù)專業(yè)”試點工作站。專業(yè)站立足為學(xué)生提供多樣化成長路徑,推進專業(yè)學(xué)位研究生產(chǎn)學(xué)研結(jié)合培養(yǎng)模式改革,構(gòu)建應(yīng)用型、復(fù)合型人才培養(yǎng)體系。
go語言的reflect(反射)
1、反射可以在運行時 動態(tài)獲取變量的各種信息 ,比如變量的類型、類別;
2、如果是結(jié)構(gòu)體變量,還可以獲取到結(jié)構(gòu)體本身的信息(包括結(jié)構(gòu)體的字段、方法);
3、通過反射,可以修改 變量的值 ,可以調(diào)用關(guān)聯(lián)的方法;
4、使用反射,需要import " reflect ".
5、示意圖:
1、不知道接口調(diào)用哪個函數(shù),根據(jù)傳入?yún)?shù)在運行時確定調(diào)用的具體接口,這種需要對函數(shù)或方法反射。
例如以下這種橋接模式:
示例第一個參數(shù)funcPtr以接口的形式傳入函數(shù)指針,函數(shù)參數(shù)args以可變參數(shù)的形式傳入,bridge函數(shù)中可以用反射來動態(tài)執(zhí)行funcPtr函數(shù)。
1、reflect.TypeOf(變量名),獲取變量的類型,返回reflect.Type類型。
2、reflect.ValueOf(變量名),獲取變量的值,返回reflect.Value類型reflect.Value是一個結(jié)構(gòu)體類型。
3、變量、interface{}和reflect.Value是可以互相轉(zhuǎn)換的,這點在實際開發(fā)中,會經(jīng)常使用到。
1、reflect.Value.Kind,獲取變量的 類別(Kind) ,返回的是一個 常量 。在go語言文檔中:
示例如下所示:
輸出如下:
Kind的范疇要比Type大。比如有Student和Consumer兩個結(jié)構(gòu)體,他們的 Type 分別是 Student 和 Consumer ,但是它們的 Kind 都是 struct 。
2、Type是類型,Kind是類別,Type和Kind可能是相同的,也可能是不同的。
3、通過反射可以在讓 變量 在 interface{} 和 Reflect.Value 之間相互轉(zhuǎn)換,這點在前面畫過示意圖。
4、使用反射的方式來獲取變量的值(并返回對應(yīng)的類型),要求數(shù)據(jù)類型匹配,比如x是int,那么久應(yīng)該使用reflect.Value(x).Int(),而不能使用其它的,否則報panic。
如果是x是float類型的話,也是要用reflect.Value(x).Float()。但是如果是struct類型的話,由于type并不確定,所以沒有相應(yīng)的方法,只能 斷言。
5、通過反射的來修改變量,注意當(dāng)使用SetXxx方法來設(shè)置需要通過對應(yīng)的指針類型來完成,這樣才能改變傳入的變量的值,同時需要使用到reflect.Value.Elem()方法。
輸出num=20,即成功使用反射來修改傳進來變量的值。
6、reflect.Value.Elem()應(yīng)該如何理解?
現(xiàn)代編程語言那些讓人激動的特性
有沒有覺得,發(fā)展到現(xiàn)在,軟件開發(fā)行業(yè)是越來越成熟了,無論是過程管理、架構(gòu)方法、設(shè)計方法,還是語言、平臺、框架、工具等,都發(fā)展到了一個前所未有的高度,相關(guān)思想和理念也日臻完善,我們真正進入了一個最好的時代。
單就編程語言來說,近些年包括Scala(2003)、Groovy(2003)、Go(2009)、Kotlin(2011)、Swift(2014)等新興編程語言如雨后春筍版涌現(xiàn)出來,也給我們帶來了很多讓人眼前一亮的編程特性,甚至Java這等老牌編程語言也是不斷推陳出新,編程再也不像過去那般枯燥。
本篇就帶大家一起感受一下現(xiàn)代編程語言那些激動人心的特性。
這個特性其實有點早了,但是也是很早就讓人感動的語言特性了,熟悉Javascript的同學(xué)應(yīng)該對它很了解。Javascript語言具有動態(tài)性,我們可以隨時為類的某個實例添加方法,也可以利用動態(tài)原型,為類的所有實例添加方法,有沒有感覺擴展類的實現(xiàn)變得非常方便了呢?
擴展和原型很像,允許我們在不修改或繼承類的情況下,將新的函數(shù)方法添加到原類中。這個特性較早見于C#這門語言,目前在Kotlin、Swift中均可以看到。這里順便說一下C#,當(dāng)時C#出來的時候,不得不說很多特性是非常棒的,包括擴展方法、泛型、分部類等等,比Java好不要太多。像Kotlin,不僅可以擴展類的方法,還可以擴展類的屬性。
前兩個都是關(guān)于擴展代碼的,這里再來一個。我們知道Java 1.8以來,接口interface里的方法可以有自己的默認(rèn)實現(xiàn)了,大大方便了實現(xiàn)類,減少了重復(fù)代碼。相對于Java的這個實現(xiàn)是顯示的,Go語言的接口實現(xiàn)可以是隱式的,添加隱式實現(xiàn)后,所有繼承的結(jié)構(gòu)(Go沒有類,都是結(jié)構(gòu)struct)都可以調(diào)用這個方法,和前面的兩個特性有異曲同工之妙,下面我們對比看一下。
C語言就有宏的概念,通過 #define 定義,然后在代碼中進行替換。宏作為Rust語言的高級特性,可以操作語法單元,是一種通過編寫代碼來生成代碼的方式,被稱作“元編程”(meta programming)。相對于函數(shù),宏可以接受任意多個參數(shù),可以減少重復(fù)代碼,定義DSL。宏語法比較復(fù)雜,難以編寫和調(diào)試,以至于在Rust文檔中說,宏將是其最后的特性。
當(dāng)你回想寫代碼枯燥的時候,應(yīng)該會想到為字段編寫getter、setter吧?較早的時候,C#就意識到了這個問題,貼心地推出了自動屬性這個語法糖。而Java開發(fā)者則是通過Eclipse、IDEA這樣的開發(fā)工具來自動生成getter、setter代碼。當(dāng)然,現(xiàn)在也可以依賴Lombook包,使用lombok的注解@Getter @Setter來編譯時生成相關(guān)代碼。
據(jù)說空指針異常是軟件業(yè)最貴的異常,價值10億美元。你有沒有為處理調(diào)用鏈中的null值而煩惱過?又或者被傷害過?Kotlin會在編譯期提示對可能為null變量的不安全使用,也提供了Elvis 操作符 ?: 來方便地處理null值。而有了可選鏈,就舒服多了??蛇x鏈語法應(yīng)該較早出現(xiàn)在JavaScript語言中,新興語言Swift也提供了這一省心的特性。Swift英明地決定變量是不允許直接存儲NIL值,當(dāng)然也提供了optionals的裝箱功能允許將NIL或其它值包裝起來,方便有時使用。
輸入乃萬惡之源,函數(shù)首要的事情就是檢查不規(guī)范和不安全的輸入,這也是衛(wèi)語句的來歷。Swift語言為此提供了專門的衛(wèi)語句語法,有了它的貼身防護,整個代碼都干爽多了,劇烈運動都不怕,不信往下瞧:
如果要評選最酷的語言特性,那么Lambda表達式必須獲得提名。Lambda表達式很早就出現(xiàn)在Lisp語言中,python也有,在后來的C#語言大放異彩,又一次狠狠地羞辱了不長進的Java,而Java也終于在1.8版本后加入了這一特性,甚至C++ 11也光榮地上車了。
我們知道編程語言有靜態(tài)和動態(tài)之分,靜態(tài)語言如Java 、 C# 、 C 和 C++,動態(tài)語言如Perl,Python,JavaScript,Ruby 和 PHP等,多數(shù)為腳本語言。而融合了靜態(tài)和動態(tài)特性的語音,就被稱為漸進式語言,如TypeScript、Common LISP、Dylan、Cecil、Visual Basic.NET、Bigloo Scheme、Strongtalk等。靜態(tài)類型檢查可以盡早地發(fā)現(xiàn) BUG,動態(tài)類型檢查可以方便地處理依賴于運行時信息的值的類型。 漸進式語言允許類型注釋來控制程序的一部分使用靜態(tài)類型檢查,而另一部分為動態(tài)檢查,更具靈活性。 Python從3.5開始引入了對靜態(tài)類型檢查的支持。
在面向?qū)ο蟮木幊陶Z言中,狀態(tài)是計算的基礎(chǔ)。由于可變狀態(tài)的存在,在編寫高并發(fā),多線程代碼時,無法知道并行進行的諸多狀態(tài)讀寫中是否有順序上的錯誤,而且這種錯誤又是難以察覺的,而不變性則規(guī)避了這個問題。 不變性是函數(shù)式編程的基礎(chǔ),不變性意味著函數(shù)沒有副作用,無論多少次執(zhí)行,相同的輸入就意味著相同的輸出,所有線程都可以無所顧忌的執(zhí)行同一個函數(shù)的代碼,代碼更像數(shù)學(xué)函數(shù),更易理解和測試。
String就是構(gòu)建在Java語言內(nèi)核中的不可變類的一個典型例子。Java 的 CopyOnWrite系列容器類也是利用了不變性增強了并發(fā)安全性。Java可以通過final修飾符實現(xiàn)類和變量的不可變。而Scala、Swift、Groovy等語言也有各自的語法實現(xiàn)不可變的變量和類。
多重分派是一些編程語言的特性,其中的函數(shù)或者方法,可以在運行時間(動態(tài)的)使用一個或多個實際參數(shù)的組合特征,路由動態(tài)分派至實現(xiàn)函數(shù)或方法。多重分派主要區(qū)別于我們常見的重載方法,重載方法是在編譯期就綁定了,而多重分派是在運行期分派的。Lisp、Julia、C#、Groovy等語言內(nèi)建多分派特性,JavaScript、Python和C等語言通過擴展支持多分派。 多重分派可以避免我們寫很多分支條件,而是更直觀地用對象類型表達,使代碼變得可讀性更好并且較少發(fā)生錯誤。
前面幾個特性是不是略顯沉悶,那么來看一下這個激動一下。解構(gòu)這一語法特性用于從數(shù)組索引或?qū)ο髮傩詣?chuàng)建變量,簡直帥到飛起。
愛寫單元測試的同學(xué)有福了,這個絕壁是重磅炸彈,在生產(chǎn)代碼里夾著測試代碼,你有想過這么寫測試嗎?誰想的?簡直腦洞打開??!該特性在Pyret語言中,Pyret旨在作為編程教育的杰出選擇,同時 探索 腳本和函數(shù)式編程的融合。
如果內(nèi)聯(lián)測試沒有讓你震驚,D語言內(nèi)聯(lián)編譯期的這個特性絕對會讓你驚掉下巴,基于該特性,開發(fā)人員可以直接在D語言中嵌入?yún)R編代碼,徹底放飛自我了,俺滴親娘??!受不了!受不了!順便說一下,D語言比較小眾,是C++的一個改進型,它包括了按合約設(shè)計、垃圾回收、關(guān)聯(lián)數(shù)組、數(shù)組切片和惰性求值等特性。
好吧,我們看點其它的來壓壓驚吧。盡管Kotlin語言也說自己實現(xiàn)了模式匹配,但是實際上只是一點點帥,真正帥的是 Elixir語言的模式匹配,Elixir作為一種在Erlang OTP上運行的動態(tài)類型語言,將模式匹配提升到了一個全新的水平。
在編程語法上,Python真是個神一樣的存在,for循環(huán)都能寫出花來。
Java 8 中提供了Stream API特性, Stream 使用一種類似用 SQL 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式,來提供一種對 Java 集合運算和表達的高階抽象。事實上這個特性C#早就有了(Java又躺槍一次)。不得不說,利用這個特性寫出來的代碼,看上去還真的是很流利的。
Go語言命令行利器cobra使用教程
cobra是一個提供簡單接口來創(chuàng)建強大的現(xiàn)代CLI界面的庫類似git git tools,cobra也是一個應(yīng)用程序,它會生成你的應(yīng)用程序的腳手架來快速開發(fā)基于cobra的應(yīng)用程序
cobra提供:
cobra建立在命令、參數(shù)、標(biāo)志的結(jié)構(gòu)之上
commands代表動作,args是事物,flags是動作的修飾符
最好的應(yīng)用程序在使用時讀起來就像句子,因此,用戶直觀地知道如何與它們交互
模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 動詞 名詞 形容詞 或者 APPNAME 命令 參數(shù) 標(biāo)志)
一些真實世界的好例子可以更好地說明這一點
kubectl 命令更能體現(xiàn)APPNAME 動詞 名詞 形容詞
如下的例子,server 是command,port是flag
這個命令中,我們告訴git 克隆url
命令是應(yīng)用程序的中心點,應(yīng)用程序支持的每一個交互都包含在一個命令中,命令可以有子命令,也可以運行操作
在上面的例子中,server是命令
更多關(guān)于cobra.Command
flag是一種修改命令行為的方式,cobra支持完全兼容POSIX標(biāo)志,也支持go flag package,cobra可以定義到子命令上的標(biāo)志,也可以僅對該命令可用的標(biāo)志
在上面的命令中,port是標(biāo)志
標(biāo)志的功能由 pflag library 提供,pflag library是flag標(biāo)準(zhǔn)庫的一個分支,在添加POSIX兼容性的同時維護相同的接口。
使用cobra很簡單,首先,使用go get按照最新版本的庫,這個命令會安裝cobra可執(zhí)行程序以及庫和依賴項
下一步,引入cobra到應(yīng)用程序中
雖然歡迎您提供自己的組織,但通?;贑obra的應(yīng)用程序?qū)⒆裱韵陆M織結(jié)構(gòu):
在Cobra應(yīng)用程序中,main.go文件通常非常簡單。它有一個目的:初始化Cobra。
使用cobra生成器
cobra提供了程序用來創(chuàng)建你的應(yīng)用程序然后添加你想添加的命令,這是將cobra引入應(yīng)用程序最簡單的方式
這兒 你可以發(fā)現(xiàn)關(guān)于cobra的更多信息
要手動實現(xiàn)cobra,需要創(chuàng)建一個main.go 和rootCmd文件,可以根據(jù)需要提供其他命令
Cobra不需要任何特殊的構(gòu)造器。只需創(chuàng)建命令。
理想情況下,您可以將其放在app/cmd/root.go中:
在init()函數(shù)中定義標(biāo)志和處理配置
例子如下,cmd/root.go:
創(chuàng)建main.go
使用root命令,您需要讓主函數(shù)執(zhí)行它。為清楚起見,Execute應(yīng)該在根目錄下運行,盡管它可以在任何命令上調(diào)用。
在Cobra應(yīng)用程序中,main.go文件通常非常簡單。它有一個目的:初始化Cobra。
可以定義其他命令,通常每個命令在cmd/目錄中都有自己的文件。
如果要創(chuàng)建版本命令,可以創(chuàng)建cmd/version.go并用以下內(nèi)容填充它:
如果希望將錯誤返回給命令的調(diào)用者,可以使用RunE。
然后可以在execute函數(shù)調(diào)用中捕獲錯誤。
標(biāo)志提供修飾符來控制操作命令的操作方式。
由于標(biāo)志是在不同的位置定義和使用的,因此我們需要在外部定義一個具有正確作用域的變量來分配要使用的標(biāo)志。
有兩種不同的方法來分配標(biāo)志。
標(biāo)志可以是“持久”的,這意味著該標(biāo)志將可用于分配給它的命令以及該命令下的每個命令。對于全局標(biāo)志,在根上指定一個標(biāo)志作為持久標(biāo)志。
也可以在本地分配一個標(biāo)志,該標(biāo)志只應(yīng)用于該特定命令。
默認(rèn)情況下,Cobra只解析目標(biāo)命令上的本地標(biāo)志,而忽略父命令上的任何本地標(biāo)志。通過啟用Command.TraverseChildren,Cobra將在執(zhí)行目標(biāo)命令之前解析每個命令上的本地標(biāo)志。
使用viper綁定標(biāo)志
在本例中,持久標(biāo)志author與viper綁定。注意:當(dāng)用戶未提供--author標(biāo)志時,變量author將不會設(shè)置為config中的值。
更多關(guān)于 viper的文檔
Flags默認(rèn)是可選的,如果希望命令在未設(shè)置標(biāo)志時報告錯誤,請根據(jù)需要進行標(biāo)記:
持久性Flags
可以使用命令的Args字段指定位置參數(shù)的驗證。
內(nèi)置了以下驗證器:
在下面的示例中,我們定義了三個命令。兩個是頂級命令,一個(cmdTimes)是頂級命令之一的子命令。在這種情況下,根是不可執(zhí)行的,這意味著需要一個子命令。這是通過不為“rootCmd”提供“Run”來實現(xiàn)的。
我們只為一個命令定義了一個標(biāo)志。
有關(guān)標(biāo)志的更多文檔,請訪問
對于一個更完整的例子更大的應(yīng)用程序,請檢查 Hugo 。
當(dāng)您有子命令時,Cobra會自動將help命令添加到應(yīng)用程序中。當(dāng)用戶運行“應(yīng)用程序幫助”時,將調(diào)用此函數(shù)。此外,help還支持所有其他命令作為輸入。例如,您有一個名為“create”的命令,沒有任何附加配置;調(diào)用“app help create”時,Cobra將起作用。每個命令都會自動添加“-help”標(biāo)志。
以下輸出由Cobra自動生成。除了命令和標(biāo)志定義之外,不需要任何東西。
幫助就像其他命令一樣。它周圍沒有特殊的邏輯或行為。事實上,你可以提供你想提供的。
您可以為默認(rèn)命令提供自己的幫助命令或模板,以用于以下功能:
當(dāng)用戶提供無效的標(biāo)志或無效的命令時,Cobra通過向用戶顯示“用法”來響應(yīng)。
你可以從上面的幫助中認(rèn)識到這一點。這是因為默認(rèn)幫助將用法作為其輸出的一部分嵌入。
您可以提供自己的使用函數(shù)或模板供Cobra使用。與幫助一樣,函數(shù)和模板也可以通過公共方法重寫:
如果在root命令上設(shè)置了version字段,Cobra會添加一個頂級的'--version'標(biāo)志。運行帶有“-version”標(biāo)志的應(yīng)用程序?qū)⑹褂冒姹灸0鍖姹敬蛴〉綐?biāo)準(zhǔn)輸出??梢允褂胏md.SetVersionTemplate(s string)函數(shù)自定義模板。
可以在命令的主運行函數(shù)之前或之后運行函數(shù)。PersistentPreRun和PreRun函數(shù)將在運行之前執(zhí)行。PersistentPostRun和PostRun將在運行后執(zhí)行。如果子函數(shù)不聲明自己的函數(shù),則它們將繼承Persistent*Run函數(shù)。這些函數(shù)按以下順序運行:
輸出:
當(dāng)發(fā)生“未知命令”錯誤時,Cobra將打印自動建議。這使得Cobra在發(fā)生拼寫錯誤時的行為類似于git命令。例如:
基于注冊的每個子命令和Levenshtein距離的實現(xiàn),建議是自動的。匹配最小距離2(忽略大小寫)的每個已注冊命令都將顯示為建議。
如果需要在命令中禁用建議或調(diào)整字符串距離,請使用:
or
您還可以使用SuggestFor屬性顯式設(shè)置將為其建議給定命令的名稱。這允許對在字符串距離方面不接近的字符串提供建議,但在您的一組命令中是有意義的,并且對于某些您不需要別名的字符串。例子:
Cobra可以基于子命令、標(biāo)志等生成文檔。請在 docs generation文檔 中閱讀更多關(guān)于它的信息。
Cobra可以為以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,這些補全功能將非常強大和靈活。在 Shell Completions 中閱讀更多關(guān)于它的信息。
Cobra is released under the Apache 2.0 license. See LICENSE.txt
GO語言(二十七):管理依賴項(下)-
當(dāng)您對外部模塊的存儲庫進行了 fork (例如修復(fù)模塊代碼中的問題或添加功能)時,您可以讓 Go 工具將您的 fork 用于模塊的源代碼。這對于測試您自己的代碼的更改很有用。
為此,您可以使用go.mod 文件中的replace指令將外部模塊的原始模塊路徑替換為存儲庫中 fork 的路徑。這指示 Go 工具在編譯時使用替換路徑(fork 的位置),例如,同時允許您保留import 原始模塊路徑中的語句不變。
在以下 go.mod 文件示例中,當(dāng)前模塊需要外部模塊example.com/theirmodule。然后該replace指令將原始模塊路徑替換為example.com/myfork/theirmodule模塊自己的存儲庫的分支。
設(shè)置require/replace對時,使用 Go 工具命令確保文件描述的需求保持一致。使用go list命令獲取當(dāng)前模塊正在使用的版本。然后使用go mod edit命令將需要的模塊替換為fork:
注意: 當(dāng)您使用該replace指令時,Go 工具不會像添加依賴項中所述對外部模塊進行身份驗證。
您可以使用go get命令從其存儲庫中的特定提交為模塊添加未發(fā)布的代碼。
為此,您使用go get命令,用符號@指定您想要的代碼 。當(dāng)您使用go get時,該命令將向您的 go.mod 文件添加一個 需要外部模塊的require指令,使用基于有關(guān)提交的詳細(xì)信息的偽版本號。
以下示例提供了一些說明。這些基于源位于 git 存儲庫中的模塊。
當(dāng)您的代碼不再使用模塊中的任何包時,您可以停止將該模塊作為依賴項進行跟蹤。
要停止跟蹤所有未使用的模塊,請運行g(shù)o mod tidy 命令。此命令還可能添加在模塊中構(gòu)建包所需的缺失依賴項。
要刪除特定依賴項,請使用go get,指定模塊的模塊路徑并附加 @none,如下例所示:
go get命令還將降級或刪除依賴于已刪除模塊的其他依賴項。
當(dāng)您使用 Go 工具處理模塊時,這些工具默認(rèn)從 proxy.golang.org(一個公共的 Google 運行的模塊鏡像)或直接從模塊的存儲庫下載模塊。您可以指定 Go 工具應(yīng)該使用另一個代理服務(wù)器來下載和驗證模塊。
如果您(或您的團隊)已經(jīng)設(shè)置或選擇了您想要使用的不同模塊代理服務(wù)器,您可能想要這樣做。例如,有些人設(shè)置了模塊代理服務(wù)器,以便更好地控制依賴項的使用方式。
要為 Go 工具指定另一個模塊代理服務(wù)器,請將GOPROXY 環(huán)境變量設(shè)置為一個或多個服務(wù)器的 URL。Go 工具將按照您指定的順序嘗試每個 URL。默認(rèn)情況下,GOPROXY首先指定一個公共的 Google 運行模塊代理,然后從模塊的存儲庫直接下載(在其模塊路徑中指定):
您可以將變量設(shè)置為其他模塊代理服務(wù)器的 URL,用逗號或管道分隔 URL。
Go 模塊經(jīng)常在公共互聯(lián)網(wǎng)上不可用的版本控制服務(wù)器和模塊代理上開發(fā)和分發(fā)。您可以設(shè)置 GOPRIVATE環(huán)境變量。您可以設(shè)置GOPRIVATE環(huán)境變量來配置go命令以從私有源下載和構(gòu)建模塊。然后 go 命令可以從私有源下載和構(gòu)建模塊。
GOPRIVATE或環(huán)境變量可以設(shè)置為匹配模塊前綴的全局模式列表,這些GONOPROXY前綴是私有的,不應(yīng)從任何代理請求。例如:
分享文章:go語言模式匹配,go語言
網(wǎng)頁鏈接:http://fisionsoft.com.cn/article/hdggci.html