當(dāng)嘗試了網(wǎng)上所有方法,仍然發(fā)現(xiàn)在主文件.go中或者在其他地方引用自定義包時(shí),自動(dòng)刪除導(dǎo)入的包的情況解決如下:
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了虎丘免費(fèi)建站歡迎大家使用!
如你存放地址的包在src/xxx.com中時(shí)請(qǐng)通過(guò)命令行進(jìn)入這個(gè)文件夾的位置
然后執(zhí)行g(shù)o mod init xxx.com/m/v1回車(chē)
上述的.../m/v1隨便,這個(gè)是按照官方的建議這么寫(xiě)的方便維護(hù)版本吧?!
再次嘗試引入自定義包,引用方式如下:
xxx.com/m/v1
|_test
| |_test.go
|_main.go
import (
"fmt"
"xxx.com/m/v1/test"
)
獻(xiàn)給被折磨許久的小伙伴們。。。
先看一下目錄結(jié)構(gòu),注意這里的src名稱(chēng)是必須的,go在設(shè)置了GOPATH后,默認(rèn)會(huì)添加src去尋找package,暫未查詢(xún)是否有方法不按照src查詢(xún)
根據(jù)上面的描述,Go語(yǔ)言中通過(guò)包中函數(shù)的名稱(chēng)來(lái)區(qū)分公共函數(shù)和私有函數(shù),我們?cè)趍ain函數(shù)中是無(wú)法調(diào)用myPrivateFunc的
此時(shí)如果執(zhí)行通過(guò)go run方式執(zhí)行,會(huì)看到如下的提示信息,這與大部分語(yǔ)言對(duì)于包管理方式相關(guān),所以我們通過(guò)兩種不同的方法來(lái)讓代碼執(zhí)行起來(lái)
返回如下,這里面對(duì)我們后續(xù)執(zhí)行有影響的兩個(gè)參數(shù)GO111MODULE和GOPATH
如果要使用gopath模式引用包,則需要關(guān)閉mod模式
設(shè)置GOPATH為當(dāng)前路徑,即main.go所在的路徑
此時(shí)再查看go env時(shí),GOPATH已經(jīng)發(fā)生改變
我們?cè)俅螄L試執(zhí)行代碼
可以看到public函數(shù)被調(diào)用
go語(yǔ)言 一個(gè)主package包引入同級(jí)目錄下go文件包編譯出錯(cuò)是設(shè)置錯(cuò)誤造成的,解決方法為:
1、先使用import "strings"導(dǎo)入strings庫(kù)。
2、HasPrefix?判斷字符串?s?是否以?prefix?開(kāi)頭。
3、HasSuffix?判斷字符串?s?是否以?suffix?結(jié)尾。
4、可以看看判斷的代碼。
5、在cmd下運(yùn)行一下go run test.go,看看如下結(jié)果。
6、Contains?判斷字符串?s?是否包含?substr,也就是判斷一下S是否在strings中。
7、在cmd下運(yùn)行g(shù)o run test.go看看結(jié)果。
一、go中為什么不允許循環(huán)依賴(lài)
二、如何解決循環(huán)依賴(lài)
循環(huán)依賴(lài)就是A引用B,B又引用A,形成了一個(gè)包引用的閉環(huán)。要解決循環(huán)引用,就是打破這個(gè)閉環(huán),讓A引用B,B不能引用A??聪旅娴睦樱?/p>
包結(jié)構(gòu)如下:
執(zhí)行main函數(shù)報(bào)錯(cuò):
報(bào)錯(cuò)的原因是 我們?cè)趫?zhí)行bagA.PrintA()的時(shí)候,引用了A包,A包又引用了B包,B包又引用了A包,形成了循環(huán)依賴(lài)。那我們打破依賴(lài)就可以了。
那么該怎么打破呢?
我們發(fā)現(xiàn)A包引用B包,是因?yàn)锳包需要調(diào)用B包的bagB.GetName()方法;同樣的,B包引用A包,是因?yàn)锽包需要調(diào)用A包的bagA.GetName()方法。那么,我們有沒(méi)有不需要引包就能使B包可以調(diào)用A包的方法呢?
當(dāng)然是有的??聪旅妫?/p>
我們?cè)贐包里定義了一個(gè)方法變量AHandler,并且提供了為這個(gè)方法變量賦值的方法Register(),然后在A包里的init()方法里,調(diào)用B包的Register()方法,將A包的GetName方法復(fù)賦值給了AHandler變量。 這樣,在B包執(zhí)行方法AHandler是不是就相當(dāng)于調(diào)用了A包的GetName方法呢?看執(zhí)行結(jié)果:
總結(jié):
上述解決辦法的核心邏輯就是,B包使用一個(gè)方法變量來(lái)替代A中的方法(來(lái)完成B不引用A),A來(lái)為該變量賦值(因?yàn)锳引用B,A可以調(diào)用B的方法來(lái)完成賦值)。 解決循環(huán)依賴(lài)問(wèn)題,思想就是打破包的循環(huán)依賴(lài),以不導(dǎo)包的方式調(diào)用其他包的方法。所以,采用接口的形式也可以解決循環(huán)依賴(lài)(B定義一個(gè)接口,A中你想要調(diào)用的方法實(shí)現(xiàn)了該接口,A中完成接口變量賦值,B來(lái)調(diào)用接口方法,有時(shí)間再補(bǔ)充例子吧)
本文名稱(chēng):go語(yǔ)言中的包引用 go引用類(lèi)型
URL標(biāo)題:http://jinyejixie.com/article26/dosgpjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)站排名、全網(wǎng)營(yíng)銷(xiāo)推廣、微信公眾號(hào)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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)