Go语言进阶,详解自定义模块的调用(同级目录与不同级目录)
创始人
2024-04-06 07:28:11
0

        Go语言中的模块是让一些相同业务的功能集合在一个目录,方便被其他业务调用,独立性强,耦合低,方便维护。Go语言零基础入门,从安装到运行代码 在这篇文章也有示例,但只说了一种生成go.mod的方式来调用的方法,尤其对于同级目录的go文件的调用,有坑在里面。

先查看下自己的go的环境,命令行输入: go env

如果列表中发现是关闭的

 set GO111MODULE=off

我们将其打开:

go env -w GO111MODULE=on

其余的环境变量,大家都可以去了解,最关键的是安装目录GOROOT与工作目录GOPATH

GO111MODULE开启

准备工作:新建一个工作目录mywork,在下面新建两个目录,testa和testb目录,再分别在其下面新建两个go文件:testa.go和testb.go,现在的目的是testa调用testb中的函数,以下是cmd命令行操作:

REM:进入目录testb,生成一个模块文件go.mod,使用域名是为了让模块名称唯一:tony.com/testb,虽然可以使用别名,但不是一种良好的编码规范cd testb
go mod init tony.com/testb
REM:进入目录testa,生成一个模块文件go.mod,模块名称指向其所在位置,最后使用tidy整理模块即可cd testa
go mod init tony.com/testa
go mod edit -replace tony.com/testb=../testb
go mod tidy

调用的时候,就是导入上面生成的模块名:import "tony.com/testb",然后使用testb调用里面的函数即可

C:\Users\Tony\go\src\mywork\testa>go run testa.go
/*
和的结果: 7
你好,寅恪光潜,近来可好?
*/

testa.go

package mainimport ("fmt""tony.com/testb"
)func main() {fmt.Println("和的结果:", testb.Sum(3, 4))fmt.Println(testb.Hello("寅恪光潜"))
}

testb.go

package testbimport "fmt"func Sum(i1 int, i2 int) int {return i1 + i2
}func Hello(s string) string {res := fmt.Sprintf("你好,%s,近来可好?", s)return res
}

GO111MODULE关闭

如果是开启的,我们将它设置成关闭模块模式,运行看下效果go run testa.go

go env -w GO111MODULE=off

testa.go:6:2: cannot find package "tony.com/testb" in any of:
        D:\Program Files\Go\src\tony.com\testb (from $GOROOT)
        C:\Users\Tony\go\src\tony.com\testb (from $GOPATH)

错误提示:我们发现找不到包了,在安装目录与工作目录都没有找到。
这个是肯定的,因为不是go.mo模块模式了,而是会在去寻找实际的本地目录,所以我们将这个模块的名称修改成本地目录即可,根目录是mywork,因为是存放在GOPATH的src目录下面

import "mywork/testb"
C:\Users\Tony\go\src\mywork\testa>go run testa.go
/*
和的结果: 7
你好,寅恪光潜,近来可好?
当然前提条件是需要放在工作目录的src里面
*/

同级目录的go文件调用

那如果同一目录下面的go文件怎么去调用呢。比如在testa目录新建一个testaa.go文件,然后调用这个新建文件里面的函数:

testaa.go

//package testaa
package mainfunc Sub(i1 int, i2 int) int {return i1 - i2
}

我们来调用试下:

package main
import "mywork/testa/testaa"
func main() {fmt.Println(testaa.Sub(5, 2))
}

C:\Users\Tony\go\src\mywork\testa>go r           un testa.go
testa.go:7:2: cannot find package "mywork/testa/testaa" in any of:
        D:\Program Files\Go\src\mywork\testa\testaa (from $GOROOT)
        C:\Users\Tony\go\src\mywork\testa\testaa (from $GOPATH)

我们发现找不到这个testaa包名,但实际上在这个目录下面是有这样的包名存在的啊。为什么?

首先这个testaa包名是一个目录,这里不是目录,是文件,另外就是同级目录不需要加载模块,只需要编译即可,然后调用的时候也是直接使用方法名调用,这是关键点,因为上面go run testa.go,没有编译testaa.go文件,所以出现找不到包或者是方法未定义等其他错误。
我们来到testa目录,然后编译里面的文件,这样就可以直接调用了,如下:

C:\Users\Tony\go\src\mywork\testa>go build

这样就在当前目录下面编译成了一个testa.exe文件,我们运行看下:

C:\Users\Tony\go\src\mywork\testa>testa
/*
和的结果: 7
你好,寅恪光潜,近来可好?
3
*/

源码如下,其中调用的时候直接Sub,不需要前面加包名来引用。

package mainimport ("fmt""mywork/testb"
)func main() {fmt.Println("和的结果:", testb.Sum(3, 4))fmt.Println(testb.Hello("寅恪光潜"))fmt.Println(Sub(5, 2))
}

巩固习题

根据上面的方法,现在我们在testb里面新增一个testbb.go文件,然后testb去调用testbb,最后在testa中调用他们,会处理吗?

testb.go

package testbimport "fmt"func Sum(i1 int, i2 int) int {return i1 + i2
}func Hello(s string) string {res := fmt.Sprintf("你好,%s,近来可好?", s)res1 := HelloBB("法外狂徒张三")return res + res1
}

testbb.go

package testbimport "fmt"func HelloBB(s string) string {res := fmt.Sprintf("Hello %s", s)return res
}

细心的伙伴们可能发现,同级目录的包名package要一样,不然编译会出错,比如testb下面所有的go文件的统一包名为package testb,然后我们将testb下面所有文件的编译,再编译testa所有文件,最后就会生成一个testa.exe,从这里也可以得出,后期同级目录下面的go文件的package名称统一是目录名称即可。

C:\Users\Tony\go\src\mywork\testb>go buildC:\Users\Tony\go\src\mywork\testb>cd ../testaC:\Users\Tony\go\src\mywork\testa>go buildC:\Users\Tony\go\src\mywork\testa>testa/*
和的结果: 7
你好,寅恪光潜,近来可好?Hello 法外狂徒张三
3
*/

相关内容

热门资讯

孙杨参赛4项 涵盖短中长距离 转自:天津日报  本报讯(记者 李蓓)昨天,即将在本周末开赛的2025全国游泳冠军赛报项名单出炉。3...
齐鲁品牌文化数智平台共建项目启...   张志恒 王鑫 济南报道  5月13日举行的“新质山东 品筑未来”2025年山东最具影响力品牌暨《...
云湖兰山服务综合体运营 转自:贵州日报 本报讯 5月13日,观山湖区环百花湖旅居推介会暨云湖兰山启幕式在观山湖区朱昌...
守好健康证的“健康关” 人都没到场,证就办好了?近日,有记者走访发现,一些医疗机构的健康证体检项目“缺斤少两”,规章制度形同...
“我的论文不是AI写的”(图) 转自:天津日报  有网友反映,自己原创的论文经过系统检测之后,竟被指出AI生成内容比例过高。据媒体报...
应用机器人与3D打印术行颌骨截...   刘通 通讯员 崔子昂 李鲲济南报道  近日,山东大学齐鲁医院口腔科颌面外科陈安威、王涛、韩亦冰及...
美股周二收盘点评:通货膨胀率下... 来源:宏观对冲陈凯丰Kevin截至4月份的12个月里,消费者物价指数上涨了2.3%,而截至3月份的1...
纽约汇市:美元下跌 美国通胀率...   彭博一项衡量美元强弱的指数兑所有G10货币均走低,此前发布的美国4月份消费者价格涨幅低于预期。投...
要为丘陵山区等研制急需急用的装... □四川日报全媒体记者 阚莹莹  近日,四川省农业农村厅发布2025年“天府良机”薄弱环节关键技术装备...
亮出低空经济发展的未来 □四川日报全媒体记者 高杲 李欣忆7款“四川造”低空产品小鹰-700飞机  ●是目前唯一国产的上单翼...
聆听“沧海龙吟” 共赏民歌之美... 转自:天津日报  本报讯(记者 张帆 摄影 曹彤)昨天,由首都图书馆发起并联合天津图书馆、河北省图书...
彩桥即将合龙   5月12日,宜宾市屏山县岷江二桥工地施工繁忙,建设者对桥梁最后几榀钢拱架进行吊装作业。岷江二桥是...
第二十届西博会5月25日开幕 ●拟邀请匈牙利、老挝为主宾国,浙江、青海为主宾省●拟特邀阿联酋担任大会合作伙伴●据初步统计,西部各地...
各美其美 美美与共 □四川日报全媒体记者 吴晓铃  在古老的历史长河中,留下帕特农神庙、雅典卫城等文明遗产的希腊是西方文...
“公证日记” 转自:天津日报  智慧公证  曾经,办理继承公证需要集齐一沓证明材料,群众要跑好几个部门;如今,滨海...
武清区扎实推进兴业富农 绘就乡... 转自:天津日报  初夏时节,灿烂的阳光夹杂着阵阵微风,深情抚慰着大运河畔的武清区南蔡村镇丁家瞿阝村。...
如皋农商银行:双向奔赴谋发展 ... 4月27日,如皋农商银行举办“跨境人民币赋能外贸企业发展”专题培训会。会议邀请跨境人民币业务优质企业...
泰州农商银行联合海陵区供销总社... 日前,泰州农商银行与泰州市海陵区供销总社在城中街道联合举办“政银携手进社区 惠民助农促消费”系列活动...
将虾苗卖到“小龙虾之乡” □四川日报全媒体记者 陈丽霏  5月,鲜活肥美的小龙虾大量上市,中江县黄鹿镇也迎来了一年中最繁忙的时...
建圈强链 四川农业明确产业“路... 5月11日,四川省大邑县现代农业(粮食产业)园区,工人在试验田中开展小麦新品的测产工作。 李旭 摄(...