基础
基础
安装配置
初始化目录
mkdir go
cd go
mkdir src pkg bin
环境变量
# Go 语言安装根目录的路径,也就是 GO 语言的安装路径。
export GOROOT=/usr/local/go
# 若干工作区目录的路径。是我们自己定义的工作空间。
export GOPATH=~/go
# GO 程序生成的可执行文件(executable file)的路径。
export GOBIN=${GOROOT}/bin
export PATH=${PATH}:/usr/local/bin:${GOROOT}/bin:{GOBIN}
Go 语言源码的组织方式
与许多编程语言一样,Go 语言的源码也是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与目录一一对应的。由于目录可以有子目录,所以代码包也可以有子包。
一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。
代码包的名称一般会与源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。
每个代码包都会有导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时,需要引入的路径。在实际使用程序实体之前,我们必须先导入其所在的代码包。具体的方式就是import该代码包的导入路径。就像这样:
import "github.com/labstack/echo"
在工作区中,一个代码包的导入路径实际上就是从 src 子目录,到该包的实际存储位置的相对路径。
所以说,Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。
Hello Word
初始化项目
go mod init github.com/bihell/dice2/twitter
Hello World 代码
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
go run cmd/graphqlserver/main.go
编译执行
go build cmd/graphqlserver/main.go
./main
源文件代码拆分
hello 函数放在另外一个源码包中
源码一:demo4.go
package main
import (
"flag"
)
var name string
func init() {
flag.StringVar(&name, "name", "everyone", "The greeting object.")
}
func main() {
flag.Parse()
hello(name)
}
源码二:demo4_lib.go
package main
import "fmt"
func hello(name string) {
fmt.Printf("Hello, %s!\n", name)
}
运行
$ go run demo4.go demo4_lib.go
Hello, everyone!
编译
$ go build demo4.go demo4_lib.go
$ ./demo4
Hello, everyone!
# 如果在同一个目录下,可以直接编译目录
$ go build puzzlers/article3/q1
$ ./q1
Hello, everyone!
源码包导入使用
源码一:puzzlers/article3/q2/demo5.go
package main
import (
"flag"
)
var name string
func init() {
flag.StringVar(&name, "name", "everyone", "The greeting object.")
}
func main() {
flag.Parse()
lib.Hello(name)
}
源码二:puzzlers/article3/q2/lib/demo5_lib.go
# 在源码文件中声明所属的代码包与其所在的目录名称要相同
package lib
import "fmt"
# 名称的首字母为大写的程序实体才可以被当前包外的代码引用,否则它就只能被当前包内的其他代码引用。
func Hello(name string) {
fmt.Printf("Hello, %s!\n", name)
}
构建安装代码包
go install puzzlers/article3/q2/lib