go語(yǔ)言的vendor go語(yǔ)言的應(yīng)用場(chǎng)景

go語(yǔ)言import時(shí)為什么都從github導(dǎo)入

go/src/go-cve-dictionary-master

為黔西等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及黔西網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、黔西網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

# mv subcommands-master /opt/go/src/subcommands

# mv net-master /opt/go/src/net

# mv go-sqlite3-master /opt/go/src/go-sqlite3

都放到了go/src目錄下了,我還修改了go-cve-dictionary-master/main.go文件內(nèi)容,如下所示:

import (

"flag"

"fmt"

"os"

"golang.org/x/net/context" 改為 “context”

"github.com/google/subcommands" 改為 subcommands

"github.com/kotakanbe/go-cve-dictionary/commands" 改為 go-cve-dictionary/commands

"github.com/kotakanbe/go-cve-dictionary/version" 改為 go-cve-dictionary/version

_ "github.com/mattn/go-sqlite3" 改為 go-sqlite3

)

執(zhí)行 # go install go-cve-dictionary-master 錯(cuò)誤如下:

can't load package: /opt/go/src/go-cve-dictionary-master/main.go:14:2: non-standard import "github.com/mattn/go-sqlite3" in standard package "go-cve-dictionary-master"

go-cve-dictionary-master/main.go:11:2: cannot find package "go-cve-dictionary/commands" in any of:

/opt/go/src/vendor/go-cve-dictionary/commands (vendor tree)

/opt/go/src/go-cve-dictionary/commands (from $GOROOT)

/root/go/src/go-cve-dictionary/commands (from $GOPATH)

go-cve-dictionary-master/main.go:12:2: cannot find package "go-cve-dictionary/version" in any of:

/opt/go/src/vendor/go-cve-dictionary/version (vendor tree)

/opt/go/src/go-cve-dictionary/version (from $GOROOT)

/root/go/src/go-cve-dictionary/version (from $GOPATH)

subcommands/subcommands.go:29:2: cannot find package "golang.org/x/net/context" in any of:

/opt/go/src/vendor/golang.org/x/net/context (vendor tree)

/opt/go/src/golang.org/x/net/context (from $GOROOT)

/root/go/src/golang.org/x/net/context (from $GOPATH

Go語(yǔ)言有什么好用的IDE嗎

我喜歡jetbrains系列的IDE+go插件。不過(guò)我要說(shuō)的是這個(gè)問(wèn)題主要看你的觀點(diǎn)如何。

說(shuō)eclipse:

構(gòu)建方式是使用go install 命令,每一次編譯運(yùn)行都是go install。這樣的好處就是如果你有很多的包,下載下來(lái)并沒(méi)有編譯,這樣每次編譯速度是很快的。而且(?。ゞo install 符合go官方的項(xiàng)目結(jié)構(gòu),官方說(shuō)過(guò)了,一個(gè)go的項(xiàng)目應(yīng)該是以個(gè)gopath,包含src,pkg,bin三個(gè)主要目錄。所以說(shuō)go install個(gè)人認(rèn)為才是主要的go編譯方式。

說(shuō)eclipse的缺點(diǎn):

其實(shí)eclipse插件的go編譯方式,還有目錄結(jié)構(gòu),項(xiàng)目結(jié)構(gòu),都是非常完美的?。。?!真的很完美!可是,他的代碼提示,太差件!大括號(hào)都不能自動(dòng)補(bǔ)全,gdb 32bit 64bit兼容問(wèn)題,eclipseC++ 沒(méi)有html js插件,需要手動(dòng)安裝,幾乎不能開(kāi)箱即用。不過(guò)如果你是開(kāi)發(fā)算法,數(shù)據(jù)處理,還是推薦eclipse的,畢竟其他都無(wú)關(guān)緊要。

說(shuō)jetbrains:

說(shuō)先說(shuō)clione肯定不適合,新建項(xiàng)目沒(méi)有向?qū)?,?dǎo)致改成go項(xiàng)目各種不開(kāi)心,比如圖標(biāo)對(duì)于我來(lái)說(shuō)就無(wú)法接受go lib 不是小耗子~這是次要的,重要的是各個(gè)文件都是灰色的(沒(méi)有在cmake中包含的結(jié)果),然后說(shuō)剩下的,phpstorm這個(gè)不說(shuō)了,估計(jì)很少有人插件按在這里,webstorm,體驗(yàn)也不是很好,idea?體驗(yàn)很好,可是畢竟比較重,尤其是現(xiàn)在加入了自家的K啥玩意(無(wú)意冒犯,沒(méi)記住單詞)~可是話說(shuō)回來(lái),go跟C系列IDE配合才是最佳,跟java系列一點(diǎn)不搭關(guān)系,用idea似乎有點(diǎn)格格不入,但是!idea支持新建項(xiàng)目向?qū)?,lib的圖標(biāo)也很清晰,最后還是選擇idea吧,期待clion的強(qiáng)大起來(lái)!

再說(shuō)jetbrains系列缺點(diǎn):

插件的構(gòu)建方式是go buiild 這個(gè)讓人很不爽,我們幾乎不確定會(huì)構(gòu)建到什么地方去,還要每次設(shè)置一下run配置。這個(gè)可能無(wú)關(guān)緊要,畢竟不是什么大的毛病,可是go build不能緩存.a文件,直接構(gòu)建的結(jié)果就是很多第三方包的情況下很慢!所以建議安裝包的時(shí)候手動(dòng)install 一下解決這個(gè)問(wèn)題。自帶代碼格式化,這個(gè)格式化跟go 格格不入,總的來(lái)說(shuō)就是蛋疼,心碎,菊花癢。

最后說(shuō)liteIDE:

輕量級(jí)IDE,我可以說(shuō)是國(guó)人GO偉大作品典范,然而默認(rèn)構(gòu)建也是go build,項(xiàng)目管理方式不符合go官方標(biāo)準(zhǔn)。代碼提示不能自動(dòng)導(dǎo)入(eclipse也不能),不過(guò)如果你的項(xiàng)目是以包為單位的,那么另當(dāng)別論。一定很不錯(cuò),畢竟是輕量級(jí)專門針對(duì)GO的IDE!

說(shuō)這些,其實(shí)還有很大一部分取決于你的項(xiàng)目是用vendor機(jī)制管理,還是godeps機(jī)制管理依賴關(guān)系。go不像java擁有強(qiáng)大的幾乎天下一統(tǒng)的maven(無(wú)意冒犯,暫不評(píng)價(jià)其他構(gòu)建套件)。

go沒(méi)有官方包倉(cāng)庫(kù)。

go沒(méi)有官方包管理工具。

go沒(méi)有官方自動(dòng)化構(gòu)建套件。

上面三個(gè)沒(méi)有是致命要害。導(dǎo)致民間各種百花齊放。

說(shuō)說(shuō)我的項(xiàng)目怎么管理

gpm 一個(gè)shell工具(windows下你可以用git的bash,或者cygwin~)

我是嚴(yán)格艷照官方推薦方式管理go項(xiàng)目,一個(gè)go項(xiàng)目一個(gè)gopath。系統(tǒng)的gopath只是為了安裝go命令,我沒(méi)有配置gobin,意義不大。

項(xiàng)目的依賴跟我的代碼包都在src下(非vendor)

vendor用來(lái)存放包的特殊依賴,發(fā)布項(xiàng)目直接把依賴包發(fā)布上去(公網(wǎng)管理則只上傳依賴關(guān)系文件 godeps文件)

資源文件等都放在src目錄同級(jí),編譯文件放在bin,引用直接../引用。

Go 如何查看一個(gè)變量的內(nèi)存地址 理解指針問(wèn)題

熟悉C語(yǔ)言的同學(xué)都知道,查看一個(gè)變量的地址在處理指針的相關(guān)問(wèn)題的時(shí)候直觀重要,在C中直接取地址符 即可。那么在Go語(yǔ)言中如何查看一個(gè)變量的地址,我們使用unsafe.Pointer() 函數(shù)來(lái)查看一個(gè)變量的內(nèi)存地址。

舉例:

type Vertex struct {

X, Y float64

}

func (v Vertex) sqrt() float64 {

return math.Sqrt(v.X * v.X + v.Y * v.Y)

}

func (v Vertex) scale(f float64) { //帶 號(hào) 和不帶*號(hào)的區(qū)別 可以從內(nèi)存地址來(lái)看出

fmt.printf("=======", unsafe.Pointer(v))//v 本身就是指針 存儲(chǔ)的就是地址 不用取地址

v.X = x.X * f

v.Y = v.Y * f

}

func main() {

v := Vertex{3, 4}

fmt.printf("=======", unsafe.Pointer(v))

v.scale(10)

fmt.Println(v.sqrt())

}

//帶 號(hào) 打印的結(jié)果 ====== -%!(EXTRA unsafe.Pointer=0xc00006e070)======%!(EXTRA unsafe.Pointer=0xc00006e070) 相同

//不帶 號(hào) 打印的結(jié)果 ======%!(EXTRA unsafe.Pointer=0xc000094060)======%!(EXTRA unsafe.Pointer=0xc000094090) 不同

去掉*號(hào) 在scale()方法中要對(duì) v 進(jìn)行取地址操作

golang的 GOPATH和vendor的搜索關(guān)系

golang的 GOPATH和vendor的搜索關(guān)系

項(xiàng)目只有一個(gè)包,即main包,沒(méi)有引用其他的包(golang自帶的系統(tǒng)包除外)。

然后設(shè)置GOPATH=path/to/goproject,再運(yùn)行g(shù)o build myproject,這樣就可以在任何目錄下面編譯,編譯生成的可執(zhí)行文件就在編譯所在的目錄下,而不是包源文件所在的目錄。

基本規(guī)則:

鑒于此,建議golang項(xiàng)目必須嚴(yán)格按照規(guī)范的目錄結(jié)構(gòu)組織,哪怕是前面這種自包含的項(xiàng)目。

基本規(guī)則:

如果一個(gè)包在vendor和GOPATH下面都存在那么誰(shuí)會(huì)優(yōu)先使用呢。

結(jié)論是:

包mydeps在vendor目錄下面和GOPATH路徑下面都存在了,那么main.go引用的時(shí)候只會(huì)引用vendor下面的mydeps(src/myproject/vendor/mydeps),而忽略GOPATH下面的mydeps包(src/mydeps)。

前面提到GOPATH和PATH類似,可以包含多個(gè)路徑,中間用分號(hào)隔開(kāi),go在搜索包的時(shí)候會(huì)按手續(xù)從前往后搜搜。那么vendor怎么處理層級(jí)關(guān)系呢。

規(guī)則是:

舉例:

如果src/mydep/mydep1/mydep.go引用了myvendor1和myvendor,那是怎么搜索的呢

go vendor的用法

使用go很長(zhǎng)時(shí)間后才整明白vendor的用法為啥這么坑人。

注意

這和當(dāng)前工作路徑相關(guān):

go module和vendor是兩個(gè)沖突的設(shè)計(jì),二者只能選一,不可混用。

如果從vendor到module遷移的怎么辦:

-mod=vendor

go 的選項(xiàng)模式

現(xiàn)在有個(gè)結(jié)構(gòu)體如下定義:

我們需要初始化結(jié)構(gòu)體,如果是其他語(yǔ)言,函數(shù)支持默認(rèn)參數(shù):

但是,go語(yǔ)言函數(shù)不支持默認(rèn)參數(shù),同時(shí)即使go語(yǔ)言支持默認(rèn)參數(shù),但是如果配置項(xiàng)過(guò)多,那么每一個(gè)配置項(xiàng)都得寫(xiě)一個(gè)默認(rèn)參數(shù),也不現(xiàn)實(shí)。

那么,在go語(yǔ)言中,我們?cè)趺磧?yōu)雅的給其初始化呢,這時(shí),就需要利用選項(xiàng)模式了(option)。

首先,我們定義一個(gè)option函數(shù)類型:

它接收一個(gè)參數(shù): *Server 。

然后定義一個(gè) NewServer 函數(shù),它接收一個(gè) Option類型的不定參數(shù):

最后,再直接定義一系列返回 Option的函數(shù)

使用時(shí),直接:

當(dāng)前文章:go語(yǔ)言的vendor go語(yǔ)言的應(yīng)用場(chǎng)景
地址分享:http://www.muchs.cn/article38/docsjpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、靜態(tài)網(wǎng)站建站公司、網(wǎng)站導(dǎo)航

廣告

聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

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