以下代码的 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 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题相关推荐

  1. c语言10个评委打分去掉一个最高分,用C语言编程:歌手大奖赛有10名评委打分,去掉一个最高分、去掉一个最低分,求选手的平均分。...

    满意答案 xxffccc 2013.10.29 采纳率:42%    等级:12 已帮助:8342人 #include #include void main() { int max(float b[] ...

  2. python函数包_python-函数包和模块

    python函数的作用: 在Python代码段中如果有一段几十行的代码,需要多次重复使用这几十行代码时,为了提高代码的可用性,将代码段放进函数体内,以后在使用中直接调用该函数模块即可,函数是一个独立的 ...

  3. PHP常用第三方包,php第三方包管理

    前言 在编写程序的时候,我们会用到别人的第三方包,俗称轮子.如何正确引入一个第三方的包,且正确合理的放置,是一个值得规范的事情. 传统的包引入include "the/path/of/fil ...

  4. r语言中调用c 程序,如何在R程序包中调用C函数

    程序包名称为pareto.这是.c文件中src目录:如何在R程序包中调用C函数 #include #include #include "Rinternals.h" #include ...

  5. java 调用r语言包传参数_Java与R语言的配置,调用

    我是最近才接触到了R语言,所以用起来有很多的问题,之前只是想单纯想用java调用到R语言中的一些东西,没有想到这个事情并不是想象的那么简单的.好了,闲话不多说,下面我来说说我在运用R的时候遇上的问题吧 ...

  6. Go 学习笔记(3)— 包概念、包特点、包名约束、main 包、包的声明、包的引用、包初始化

    1. 包的概念 Go 语言是使用包来组织源代码的,并实现命名空间的管理.任何源代码文件必须属于某个包.源码文件的第一行有效代码必须是 package pacakgeName 语句,通过该语句声明自己所 ...

  7. go get 的不再src目录中_GO语言基础进阶教程:包的使用

    Go语言使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显得& ...

  8. Go语言圣经 - 第10章 包和工具 - 10.7 工具

    第10章 包和工具 现在随便一个小程序可能就包含10000个函数,但是我们不可能一个个去构建,大部分还是来自于他人,这些函数通过类似包和模块的方式被重用 go语言的包超过100个,可以在终端中使用go ...

  9. R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...

最新文章

  1. SpringBoot-JPA入门
  2. Spring:一个Java框架15年的演化
  3. eclipse查看mysql代码_在eclipse中查看Android源代码
  4. 全世界还有44亿人无法上网
  5. 阿里二面:你来设计一下 Flink 性能调优?
  6. IE下var丢失造成的错误
  7. ThinkPHP6项目基操(13.实战部分 项目中的自定义异常处理总结 错误页面API错误)
  8. c#分页读取GB文本文件
  9. Design Patterns
  10. 国内O2O运营模式逐渐改变我们生活方式
  11. Ubertooth one“蓝牙扫描嗅探”使用教程
  12. 【软件测试】测试人终将迎来末路?测试人的我35岁就坐等失业?
  13. 【Python3.6爬虫学习记录】(八)Selenium模拟登录新浪邮箱并发送邮件
  14. Python 【人工智能】【大数据】【全栈】【自动化】技能-张子夜-专题视频课程...
  15. 云服务器安装软件,如何在云服务器中安装软件
  16. 解决windows10环境下conda创建环境出现 No writeable pkgs directories configured
  17. redis主从结构 (一主一从,一主多从,主从从)
  18. cdn perl_用perl对CDN节点日志进行统计
  19. C++算法之归并排序
  20. 快速批量压缩照片到指定大小工具,照片图片批量压缩实现方法,批量压缩工具

热门文章

  1. docker安装kafka消息队列
  2. 2022-2028年中国商业综合体行业市场前瞻与投资规划分析报告
  3. 受用一生的高效 PyCharm 使用技巧(二)pycharm 指定参数运行文件
  4. RNN,LSTM,GRU基本原理的个人理解重点
  5. LeetCode中等题之特殊等价字符串组
  6. camera中LENS和SENSOR的CRA是如何搭配的?
  7. PaddlePaddle推理部署
  8. 编译器设计-符号表-中间代码生成
  9. 编译器设计-RunTime运行时环境
  10. Docker_Swarm集群系统