Go 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题
以下代码的 GOPATH
路径为 "/home/wohu/GoCode"
1. 同一个包内的函数可以相互调用
代码结构如下:
wohu@wohu:~/GoCode/src$ tree temp
temp
├── chapter
│ ├── demo1
│ │ ├── demo1.go
│ │ └── demo1_lib.go
demo1.go
源码如下:
package mainfunc main() {name := "wohu"hello(name) // 调用以小写字母开头的同一个包内的函数
}
demo1_lib.go
源码如下:
package mainimport "fmt"// hello() 函数名称为小写开头
func hello(name string) {fmt.Printf("Hello, %s!\n", name)
}
运行结果:
[Running] cd "/home/wohu/GoCode/src/temp/chapter/demo1/" && go run .
Hello, wohu!
可以看到包内的函数是可以被包内其它任意函数调用的。
2. 包名和实际路径最后一个目录一致
代码目录结构如下:
wohu@wohu:~/GoCode/src$ tree temp
temp
├── chapter
│ ├── demo2
│ │ ├── demo2.go
│ │ └── lib
│ │ └── demo2_lib.go
demo2.go
源码如下:
package mainimport ("temp/chapter/demo2/lib"
)func main() {name := "wohu"lib.Hello(name) // 直接使用 包名.函数名称来调用函数
}
其中导入 demo2_lib.go
所在的相对 GOPATH
路径为 "temp/chapter/demo2/lib"
demo2_lib.go
源码如下:
package lib // 包名和实际路径中最后一个文件夹名称相同import "fmt"func Hello(name string) {fmt.Printf("Hello, %s!\n", name)
}
运行结果:
[Running] cd "/home/wohu/GoCode/src/temp/chapter/demo2/" && go run .
Hello, wohu!
3. 包名和实际路径最后一个目录不一致
同样的目录结构
wohu@wohu:~/GoCode/src$ tree temp
temp
├── chapter
│ ├── demo2
│ │ ├── demo2.go
│ │ └── lib
│ │ └── demo2_lib.go
demo2_lib.go
代码, 声明其包名为 lib2
package lib2import "fmt"func Hello(name string) {fmt.Printf("Hello, %s!\n", name)
}
修改 demo2.go
代码如下
package mainimport ("temp/chapter/demo2/lib"
)func main() {name := "wohu"lib.Hello(name)
}
运行出错:
[Running] cd "/home/wohu/GoCode/src/temp/chapter/demo2/" && go run .
# temp/chapter/demo2
./demo2.go:4:2: imported and not used: "temp/chapter/demo2/lib" as lib2
./demo2.go:9:2: undefined: lib
为什么会是这样?根本原因就是,我们在源码文件中声明所属的代码包与其所在目录的名称不同。
请记住,源码文件所在的目录相对于 src
目录的相对路径就是它的代码包导入路径,而实际使用其程序实体时给定的限定符(本示例代码中的 lib
)要与它声明所属的代码包名称对应。
重要: import
后面的最后一个元素其实是目录名而不是包名!!!
而如下修改,
package mainimport ("temp/chapter/demo2/lib2"
)func main() {name := "wohu"lib2.Hello(name)
}
运行报错:
[Running] cd "/home/wohu/GoCode/src/temp/chapter/demo2/" && go run .
demo2.go:4:2: cannot find package "temp/chapter/demo2/lib2" in any of:/usr/local/go/src/temp/chapter/demo2/lib2 (from $GOROOT)/home/wohu/GoCode/src/temp/chapter/demo2/lib2 (from $GOPATH)
从提示的错误信息可以看到是因为没有找到 "temp/chapter/demo2/lib2"
目录。
继续使用别名修改
package mainimport (p "temp/chapter/demo2/lib"
)func main() {name := "wohu"p.Hello(name)
}
或者
package mainimport ("temp/chapter/demo2/lib"
)func main() {name := "wohu"lib2.Hello(name)
}
即在 import
时导入的是目录名,而在外部进行调用时需要使用包名作为前缀 lib2.Hello(name)
。
import "目录名"
包名.Hello()
因此,为了不让该代码包的使用者产生困惑,我们总是应该让声明的包名与其父目录的名称一致。
包名和目录名不一致时需要注意:
- 目录名使用在文件层面,例如库的安装路径名、库文件名以及被导入时的路径;
- 包名使用在代码层面,例如调用包的函数时;
Go 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题相关推荐
- c语言10个评委打分去掉一个最高分,用C语言编程:歌手大奖赛有10名评委打分,去掉一个最高分、去掉一个最低分,求选手的平均分。...
满意答案 xxffccc 2013.10.29 采纳率:42% 等级:12 已帮助:8342人 #include #include void main() { int max(float b[] ...
- python函数包_python-函数包和模块
python函数的作用: 在Python代码段中如果有一段几十行的代码,需要多次重复使用这几十行代码时,为了提高代码的可用性,将代码段放进函数体内,以后在使用中直接调用该函数模块即可,函数是一个独立的 ...
- PHP常用第三方包,php第三方包管理
前言 在编写程序的时候,我们会用到别人的第三方包,俗称轮子.如何正确引入一个第三方的包,且正确合理的放置,是一个值得规范的事情. 传统的包引入include "the/path/of/fil ...
- r语言中调用c 程序,如何在R程序包中调用C函数
程序包名称为pareto.这是.c文件中src目录:如何在R程序包中调用C函数 #include #include #include "Rinternals.h" #include ...
- java 调用r语言包传参数_Java与R语言的配置,调用
我是最近才接触到了R语言,所以用起来有很多的问题,之前只是想单纯想用java调用到R语言中的一些东西,没有想到这个事情并不是想象的那么简单的.好了,闲话不多说,下面我来说说我在运用R的时候遇上的问题吧 ...
- Go 学习笔记(3)— 包概念、包特点、包名约束、main 包、包的声明、包的引用、包初始化
1. 包的概念 Go 语言是使用包来组织源代码的,并实现命名空间的管理.任何源代码文件必须属于某个包.源码文件的第一行有效代码必须是 package pacakgeName 语句,通过该语句声明自己所 ...
- go get 的不再src目录中_GO语言基础进阶教程:包的使用
Go语言使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显得& ...
- Go语言圣经 - 第10章 包和工具 - 10.7 工具
第10章 包和工具 现在随便一个小程序可能就包含10000个函数,但是我们不可能一个个去构建,大部分还是来自于他人,这些函数通过类似包和模块的方式被重用 go语言的包超过100个,可以在终端中使用go ...
- R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...
最新文章
- SpringBoot-JPA入门
- Spring:一个Java框架15年的演化
- eclipse查看mysql代码_在eclipse中查看Android源代码
- 全世界还有44亿人无法上网
- 阿里二面:你来设计一下 Flink 性能调优?
- IE下var丢失造成的错误
- ThinkPHP6项目基操(13.实战部分 项目中的自定义异常处理总结 错误页面API错误)
- c#分页读取GB文本文件
- Design Patterns
- 国内O2O运营模式逐渐改变我们生活方式
- Ubertooth one“蓝牙扫描嗅探”使用教程
- 【软件测试】测试人终将迎来末路?测试人的我35岁就坐等失业?
- 【Python3.6爬虫学习记录】(八)Selenium模拟登录新浪邮箱并发送邮件
- Python 【人工智能】【大数据】【全栈】【自动化】技能-张子夜-专题视频课程...
- 云服务器安装软件,如何在云服务器中安装软件
- 解决windows10环境下conda创建环境出现 No writeable pkgs directories configured
- redis主从结构 (一主一从,一主多从,主从从)
- cdn perl_用perl对CDN节点日志进行统计
- C++算法之归并排序
- 快速批量压缩照片到指定大小工具,照片图片批量压缩实现方法,批量压缩工具