go语言详解-----包(package)引入

一、go语言基础

1、每一个可运行的go程序必须要有一个main 包(package),即package main;并且该main包中必须要有一个main函数,这是一个入口函数。

2、一个包中的描述符要能够被其他的包引用,那么该包中的相关描述符的首字母一定要大写

二、 GOPATH 模式 (GO111MODULE=off)

1、每一个源码文件必须属于一个包

package greetingsimport "fmt"// Hello returns a greeting for the named person.
func Hello(name string) string {// Return a greeting that embeds the name in a message.message := fmt.Sprintf("Hi, %v. Welcome!", name)

2、dot(.) 别名引入

import ("fmt"   .  "./yyzc"
)

这种方式引入,可以不使用别名.函数名方式引用函数,可以直接引用函数名,但是要避免函数名重复。

3、一个文件夹下的*(不包括子文件夹)所有源文件必须属于同一个包,否则会报如下错

PS C:\Users\love1\Documents\technology\go\project1\hello> go run hello.go
hello.go:6:5: found packages greeting (greet1.go) and greetings (greetings.go) in C:\Users\love1\Documents\technology\go\project1\test

greetings.go

package greetingsimport "fmt"// Hello returns a greeting for the named person.
func Hello(name string) string {// Return a greeting that embeds the name in a message.message := fmt.Sprintf("Hi, %v. Welcome!", name)return message
}

greet1.go

package greetingimport "fmt"// Hello returns a greeting for the named person.
func HelloWolrd(name string) string {// Return a greeting that embeds the name in a message.message := fmt.Sprintf("Hi, %v. Hello World!", name)return message
}

4、同一个目录下(不含子目录)的源码,即同一个包(package)中的源码中全局变量要唯一

PS C:\Users\love1\Documents\technology\go\project1\hello> go run hello.go# /C/Users/love1/Documents/technology/go/project1/test
…\test\greetings.go:6:6: Hello redeclared in this block
…\test\greet1.go:6:6: other declaration of Hello
PS C:\Users\love1\Documents\technology\go\project1\hello>

greetings.go

package greetingsimport "fmt"// Hello returns a greeting for the named person.
func Hello(name string) string {// Return a greeting that embeds the name in a message.message := fmt.Sprintf("Hi, %v. Welcome!", name)return message
}

greet1.go

package greetingsimport "fmt"// Hello returns a greeting for the named person.
func Hello(name string) string {// Return a greeting that embeds the name in a message.message := fmt.Sprintf("Hi, %v. Hello World!", name)return message
}

5、同一个go项目中,如果出现了相同的包(package)名,需要使用别名来区分,类似如下:

import ("fmt" "../test"greet   "../test/yyzc"
)

6、go语言在包引入的时候,引入的是一个路径,即目录

相对路径引入

import ( "../test"
greet   "../test/yyzc"
)

此种引入方式,会到对应的相对路径下检测,首先检测该路径(不包含子路径)下的所有源文件是否属于同一个包(package),如果不是,则会报错,如果是则会标记该目录为packagename名,也可以使用别名引用 ,别名引用:

import ( 
greet   "../test/yyzc"
)

标准引入

import ("fmt" )

标准引入方式,会去到 $GOPATH\src$GOROOT\src 路径下检查此目录,如果没有此目录则会报错,如果有次目录则会遍历该目录(不含子目录)中所有的文件,提取包名,并引用此包名。

7、一个目录所形成的包与其子目录所形成的包(package)是不一样的,即包是以目录为单位的,不包含其子目录 ,如果目录与其子目录包(package)名一样,则会报错,可以用上述方法避免错误。或者直接使用不一样的包名

三、module-aware模式(GO111MODULE=on)

这种模式下,相对路径引入会报如下错误

package mainimport ("fmt" "../test"greet   "../test/yyzc"
)func main() {// Get a greeting message and print it.message := greetings.Hello("Gladys")fmt.Println(message)message1 := greet.Hello("Gladys")fmt.Println(message1)
}

S C:\Users\love1\Documents\technology\go\project1\hello> go run hello.go
hello.go:6:5: “…/test” is relative, but relative import paths are not supported in module mode
hello.go:7:3: “…/test/yyzc” is relative, but relative import paths are not supported in module mode
PS C:\Users\love1\Documents\technology\go\project1\hello>

将上述文件夹test放在 $GOROOT\src 路径下,再去引用,就不会报错

package mainimport ("fmt" "test"greet   "test/yyzc"
)func main() {// Get a greeting message and print it.message := greetings.Hello("Gladys")fmt.Println(message)message1 := greet.Hello("Gladys")fmt.Println(message1)
}

但是如果将文件夹test放在 $GOPATH\src 路径下,再去引用,会报如下错误

PS C:\Users\love1\Documents\technology\go\project1\hello> go run hello.go
hello.go:6:5: package test is not in GOROOT (C:\Program Files\Go\src\test)
hello.go:7:3: package test/yyzc is not in GOROOT (C:\Program Files\Go\src\test\yyzc)
PS C:\Users\love1\Documents\technology\go\project1\hello>

那么如果非 $GOPATH\src 路径下的包该如何引用呢?

1、main包所在的目录下需要有一个go.mod文件,可以使用go mod init modname 初始化一个mod文件,否则会报错

2、

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都精灵云复试完结篇

最近参加了成都精灵云的笔试与面试,岗位是c工程师。后面自己复盘了过程,复试部分总结如下,希望能对各位想进该公司以及面试C工程师的同学提供一些参考。     后续也会陆续分享各公司的面试和笔试经验在该专栏,想看的可以关注一下…

排序算法-插入排序

属性 当插入第i(i>1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移 直接插入排序…

了解Zookeeper总结知识点

ZooKeeper 是什么? Zookeeper是Apache下的一个开源的分布式协调中间件。是一个CP系统,为分布式系统提供强一致性的数据管理。 底层基于类似文件系统的目录节点树方式进行数据存储。每个节点默认最大大小为1M,用于存储数据或节点信息。Zookee…

在微信公众号怎么实现每日签到功能

在微信公众号中实现每日签到功能,可以为企业或公众号运营者带来许多好处。每日签到功能不仅可以增加用户粘性,提高用户参与度,还可以为公众号带来更多的流量和曝光度。那么,如何在微信公众号中实现每日签到功能呢?本文…

vue3中css使用script中定义的变量

代码 <template><div class"box">haha</div> </template><script setup lang"ts"> const boxWidth 500px </script><style lang"scss"> .box {width: v-bind(boxWidth);height: 200px;background-c…

易优cms小程序插件升级到2.1版本

eyou小程序升级到2.1&#xff0c;主要新增一键获取手机号&#xff0c;统一返回格式等 升级内容&#xff1a; &#xff08;1&#xff09;对全部接口的返回格式做统一化设置 &#xff08;2&#xff09;新增一键获取手机号功能 &#xff08;3&#xff09;新增footprint足迹接口 &…

百度测开初面面试题分享(答案+文档)

1、java常用的异常处理机制 Java常用的异常处理机制有以下几种&#xff1a; 1&#xff09;try-catch-finally语句&#xff1a;用于捕获和处理异常。将可能抛出异常的代码放在try块中&#xff0c;然后在catch块中处理异常。无论是否发生异常&#xff0c;finally块中的代码都会…

长胜证券:怎么跟随主力进出?

跟着现在商场的快速改变和信息的普及化&#xff0c;人们在出资时越来越需求愈加精确的辅导和剖析。尤其是在股票商场&#xff0c;很多人想知道怎么跟从主力进出以获取更高的收益。在这篇文章中&#xff0c;咱们将从多个视点来评论这个论题。 一、了解主力资金的进出方向 首先&…

C++ Enet通信封装

C Enet通信封装 接口封装使用举例 Enet底层封装的是UDP通信&#xff0c;本文介绍了enet如何实现可靠udp传输的代码封装 接口封装 1)User_Enet_Listen监听端口函数 int User_Enet_Listen(const char *ip, int port, ENetHost **host) { ENetAddress address; if(!strcmp(i…

无涯教程-JavaScript - ISODD函数

描述 如果数字为奇数,则ISODD函数返回TRUE,如果数字为偶数,则返回FALSE。 语法 ISODD (number) 争论 Argument描述Required/OptionalNumber 要测试的值或表达式。 如果number不是整数,则将其截断。 Required Notes 您可以在执行计算之前使用此功能测试单元格的内容。 如果…

BUG:阿里巴巴图标库引入链接后,icon有时候会不显示的话svg下载到本地使用

忽然icon图标就不显示&#xff0c;但是代码、icon链接地址都没有发生变化 解决办法&#xff1a;将icon图标下载到本地&#xff0c;记住前后引用本地的名字要保持一致

软件设计师学习笔记9-进程调度

目录 1. PV操作 1.1进程的同步与互斥 1.1.1互斥 1.1.2同步 1.2 PV操作 1.2.1信号量 1.2.2 PV操作的概念 2.信号量与PV操作 2.1 PV操作与互斥模型 2.2 PV操作与同步模型 2.3 互斥与同步模型结合 3.前趋图与PV操作 1. PV操作 1.1进程的同步与互斥 1.1.1互斥 互斥&…

DOM文档对象模型

10.DOM文档对象模型 1.DOM节点的组成 元素节点 属性节点 文本节点 标签就是元素节点 class id的值 等 就是属性节点 文字,空格,换行就是文本节点 <div class"box">你好</div><元素节点 属性节点>文本不节点</元素节点>2如何获取页面元素…

Apache HTTPD 漏洞复现

文章目录 Apache HTTPD 漏洞复现1. Apache HTTPD 多后缀解析漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.4 获取GetShell1.5 漏洞防御 2. Apache HTTPD 换行解析漏洞-CVE-2017-157152.1 漏洞描述2.2 漏洞复现2.3 漏洞利用2.4 修复建议 3. Apache HTTP Server_2.4.49 路径遍历和…

无涯教程-JavaScript - ISREF函数

描述 如果指定的值是参考,则ISREF函数返回逻辑值TRUE。否则返回FALSE。 语法 ISREF (value) 争论 Argument描述Required/OptionalvalueA reference to a cell.Required Notes 您可以在执行任何操作之前使用此功能测试单元格的内容。 适用性 Excel 2007,Excel 2010,Exce…

LCP 50. 宝石补给

每位勇者初始都拥有一些能量宝石&#xff0c; gem[i] 表示第 i 位勇者的宝石数量。现在这些勇者们进行了一系列的赠送&#xff0c;operations[j] [x, y] 表示在第 j 次的赠送中 第 x 位勇者将自己一半的宝石&#xff08;需向下取整&#xff09;赠送给第 y 位勇者。 在完成所有…

【LeetCode】210. 课程表 II——拓扑排序

题目链接&#xff1a;210. 课程表 II 题目描述&#xff1a; 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如…

【计算机网络】网络编程接口 Socket API 解读(7)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…

【Flowable】使用UEL整合Springboot从0到1(四)

前言 在前面我们介绍了Springboot简单使用了foleable以及flowableUI的安装和使用&#xff0c;在之前我们分配任务的处理人的时候都是通过Assignee去指定固定的人的。这在实际业务中是不合适的&#xff0c;我们希望在流程中动态的去解析每个节点的处理人&#xff0c;当前flowab…

9.12 C++作业

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…