内容简介:我们在使用其他语言,比如Java,是有包的概念的,它是Java语言中组织我们的Java文件的一个概念,比如java.lang这个包,他里面有很多我们常用的类,比如String。在Go语言中,包也是类似的概念,它是把我们的go文件组织起来,可以方便进行归类、复用等目的。 比如Go内置的net包
我们在使用其他语言,比如Java,是有包的概念的,它是 Java 语言中组织我们的Java文件的一个概念,比如java.lang这个包,他里面有很多我们常用的类,比如String。在 Go 语言中,包也是类似的概念,它是把我们的go文件组织起来,可以方便进行归类、复用等目的。 比如Go内置的net包
net
├── http
├── internal
├── rpc
├── smtp
├── testdata
├── textproto
└── url
以上是net包的一个目录结构,net本身是一个包,net目录下的http又是一个包。从这个大家可以看到,go语言的包其实就是我们计算机里的目录,或者叫文件夹,通过它们进行目录结构和文件组织,go只是对目录名字做了一个翻译,叫【包】而已。比如这里的net包其实就是net目录,http包其实就是http目录,这也是go语言中的一个命名习惯,包名和文件所在的目录名是一样的。
go语言中包的定义和使用看起来十分简单:
通过package关键字定义包:
package xxx
使用import关键字,导入要使用的标准库包或第三方依赖包。
import "fmt"
fmt.Println("Hello, World")
通过上面的代码,我们大致对包有了一点了解。我们来看一个另一段代码。
import "a/b/c"
c.Func1()
很多Golang初学者看到上面代码,都会想当然的将import后面的"c"、"fmt"当成包名,将其与c.Func1()和 fmt.Println()中的c和fmt认作为同一个语法元素:包名。但在深入Golang后,很多人便会发现事实上并非如此。不禁有个疑问:import后面路径中的最后一个元素到底代表的是啥? 是包名还是仅仅是一个路径?
本次实验目录结构:
我们建立libproj2/foo目录,其中的foo1.go代码如下:
//foo1.go
package bar
import "fmt"
func Bar1() {
fmt.Println("Bar1")
}
注意:这里package名为bar,与目录名foo完全不同。
接下来就给app2带来了难题:该如何import bar包呢?
我们假设import路径中的最后一个元素是包名,而非路径名。
//app2/main.go
package main
import (
"libproj2/bar"
)
func main() {
bar.Bar1()
}
编译app2:
$go build -x -v app2
WORK=/var/folders/2h/xr2tmnxx6qxc4w4w13m01fsh0000gn/T/go-build736904327
main.go:5:2: cannot find package "libproj2/bar" in any of:
/Users/tony/.Bin/go14/src/libproj2/bar (from $GOROOT)
/Users/tony/Test/Go/pkgtest/src/libproj2/bar (from $GOPATH)
编译失败,在两个路径下无法找到对应libproj2/bar包。
我们的假设错了,我们把它改为路径:
//app2/main.go
package main
import (
"libproj2/foo"
)
func main() {
bar.Bar1()
}
再编译执行:
$go build app2 $app2 Bar1
这回编译顺利通过,执行结果也是OK的。这样我们得到了结论: (3)import后面的最后一个元素应该是路径,就是目录,并非包名 。
go编译器在这些路径(libproj2/foo)下找bar包。这样看来,go语言的惯例只是一个特例,即恰好目录名与包名一致罢了。也就是说下面例子中的两个foo含义不同:
import "libproj1/foo"
func main() {
foo.Foo()
}
import中的 foo 只是一个文件系统的路径罢了。而下面foo.Foo()中的 foo 则是包名。而这个包是在libproj1/foo目录下的源码中找到的。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 理解导入fbx时的Scale
- ASP.NET Aries 高级开发教程:Excel导入之多表高级导入配置(中)
- 将Excel文件导入数据库(POI+Excel+MySQL+jsp页面导入)第一次优化
- [MySQL]备份和导入
- Android Studio 导入源码
- Python导入订单是否重要
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Cyberwar
Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96
The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!
UNIX 时间戳转换
UNIX 时间戳转换
RGB HSV 转换
RGB HSV 互转工具