工作区介绍
Go代码必须放在工作区中。工作区其实就是一个对应于特定工程的目录,它应包含3个子目录:src目录、pkg目录和bin目录。
src目录:用于以代码包的形式组织并保存Go源码文件。(比如:.go .c .h .s等)
pkg目录:用于存放经由go install命令构建安装后的代码包(包含Go库源码文件)的“.a”归档文件。
bin目录:与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
目录src用于包含所有的源代码,是Go命令行工具一个强制的规则,而pkg和bin则无需手动创建,如果必要Go命令行工具在构建过程中会自动创建这些目录。
需要特别注意的是,只有当环境变量GOPATH中只包含一个工作区的目录路径时,go install命令才会把命令源码安装到当前工作区的bin目录下。若环境变量GOPATH中包含多个工作区的目录路径,像这样执行go install命令就会失效,此时必须设置环境变量GOBIN。
工作区总结(懒得看大段文字,看这个就好了)
3个目录:
src:必须的,放源代码
pkg:可以不用,install后的代码包,就是库
bin:保存install后的可执行文件,就是保存编译后的程序
为了能够构建这个工程,需要先把所需工程的根目录加入到环境变量GOPATH中。否则,即使处于同一工作目录(工作区),代码之间也无法通过绝对代码包路径完成调用。
在实际开发环境中,工作目录往往有多个。这些工作目录的目录路径都需要添加至GOPATH。当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下。
gopath总结:
是go的环境变量,gopath就是指定项目的目录
新建一个项目一定要把它放到环境变量gopath
是大型项目肯定有多个包,互相import
一个项目至少有一个main包
package main
import "fmt"
//或者
import{
"fmt"
"os"
}
包名也可以取别名
import specialName "fmt"
还有就是忽略此包
这个包可以不用,也不会编译报错
go语言的语法严格:创建出来的变量和引入的包必须使用,不然会报错
import _ "fmt"
main函数和init函数
Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数在定义时不能有任何的参数和返回值。虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。
Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是可选的,但package main就必须包含一个main函数。
每个包可以包含任意多个 init 函数,这些函数都会在程序执行开始的时候被调用。所有被
编译器发现的 init 函数都会安排在 main 函数之前执行。 init 函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。
程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。
有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。
当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。
main函数和init函数总结
init函数顾名思义就是初始化的意思
当我们import其他包的时候:
加载全局变量 -->运行init函数初始化—>运行main函数
同一个目录下包名必须一样
一个项目必须有一个main包
同一个目录下的项目互相调用不需要import
以下三个目录:
src/main
src/main/main.go package main
src/main/2.go package main
src/first
src/first/3.go package first
src/first/4.go package first
src/second
src/second/5.go package second
src/second/5.go package second
如果main包里想要调用first目录下的,就要import
如果main想要调用自己目录下的,就不需要import,直接用