包
简单地理解就是一组源码看做一个包,这些源码都放在一个目录下,可以被其他文件调用。每个包都对应一个独立的名字空间,这样看是不是有点像命名空间?
- 文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
- 文件夹名与包名没有直接关系,并非需要一致。
- 同一个文件夹下的文件只能有一个包名,否则编译报错。
- 同一个文件夹下(同一个包)互相调用函数不用引用包。(本质上可以看做是一个文件)
包中成员以名称⾸字母⼤⼩写决定访问权限:
- public: ⾸字母⼤写,可被包外访问
- private: ⾸字母⼩写,仅包内成员可以访问
注意:同一个目录下不能定义不同的package。
比如:
目录结构
- my_go
- myLib
- func.go
- func2.go
- hello.go
func.go
//故意和文件夹名和文件名都不一样,但是更推荐保持一致
package myLib2
//公有的
func Add(x,y int) int {
return x + y
}
//私有的
func add(x,y int) int {
return x + y
}
func2.go
//必须保持一致,一个文件夹里面的报名要一样
package myLib2
func Sub(x,y int) int {
a := add(x,y) //同一包名下可以直接用,公有私有都可以
println(a)
return x - y
}
hello.go
package main //包名
//fmt 包实现了格式化 IO(输入/输出)
// import 倒入的其实是文件名,不是包名
import (
"./myLib"
"fmt"
)
func main() {
//go里面的全局函数要首字母大写
fmt.Println(myLib2.Add(1,1)) //使用的是包名
fmt.Println(myLib2.Sub(1,1))
//fmt.Println(myLib2.add(1,1)) //私有的不能用
}
包的引用方式
//忽略此包,为了只使用其init函数
import _ "fmt"
func main() {
}
//推荐
import (
"fmt"
"os"
)
/* 最好不要用,虽然可以简化编码,但是会不好阅读
//给包名起别名
import io "fmt"
func main() {
io.Println("this is a test")
}
*/
/* 请忘记这个方式,别用
//.操作
import . "fmt" //调用函数,无需通过包名
import . "os"
func main() {
Println("this is a test")
Println("os.Args = ", Args)
}
*/
init函数和main函数
main函数就是程序入口,必须有,其所在的包就是main包,它所在的目录名或文件名也是可执行文件的文件名。
init函数也就是初始化函数或者叫构造函数。会在函数执行前执行。
比如引入顺序A包(main包)-->B包-->C包-->D包,就会先执行D的init函数,再执行D的代码,最后执行main的init函数和main函数。
goPath
Go语言要求我们将一个工程放在叫GoPath的地方,里面包含3个子目录:src目录、pkg目录和bin目录。
- src目录:用于以代码包的形式组织并保存Go源码文件。(比如:.go .c .h .s等)
- pkg目录:用于存放经由go install命令构建安装后的代码包(包含Go库源码文件)的“.a”归档文件。
- bin目录:与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
go install 命令,用于编译整个工程,编译前必须要设置好goPath和GoBin。
go env 命令,查看当前的go环境,里面就有goPath
比如:
项目目录 E:\mycode\my_go
这里的goPath是全局的,每个项目还有个自己的,在编辑器里面配置,如果只有一个项目,可以把这个改成项目目录。
在这里插入图片描述
在windowsPowerShell里面打印
在
在编辑器里面打印
在这里插入图片描述
生成前:
在这里插入图片描述
此时在windowsPowerShell里面执行 go install ,则会生成目录和可执行文件:
在这里插入图片描述
网友评论