Golang版本:go version go1.17.3 windows/amd64

学习环境:Visual Studio Code

环境变量

环境变量名称 作用
GOROOT Golang的安装目录。
GOBIN 使用go install命令安装程序时二进制文件的输出目录。
GOPROXY 设置代理,由于某些你懂得的原因很重要,推荐https://goproxy.cn/
GOPATH Golang工作区,一台机器可以有多个,不用Go Module的情况下代码必须放在工作区。

GOPATH目录详情

一台机器上的GOPATH目录可以有多个,所以有时候会比较迷惑。比如有两个GOPATH目录,执行go get的时候可能源码下载到了第一个GOPATH里面这时候在第二个里面就找不到了。

GOPATH目录下分三个目录:

  • bin目录用来存放go install命令生成的二进制文件(未指定环境变量GOBIN的情况下)。

  • pkg目录用来存放生成的库文件。

  • src目录用来存放源代码(自己写的和网上下载的都算)。

目录结构参考:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
H:\GO\SRC\DMSTORY.CN    #src下先跟公司名或网站名
└─ddm   #后跟个人或项目名
    ├─greet #greet包
          sayhi.go #包的代码
    
    ├─helloworld    #项目main包
          main.go  #main包代码,名字不一定叫main
    
    └─math  #math包
            add.go
            substract.go

基础命令

命令 作用
go run 后跟包含main方法的源码文件,直接生成二进制(在临时目录里)并运行。
go build
  • 不加参数,相当于go build .
  • 目录参数,必须是main包目录,生成二进制文件,文件名为为目录名,如果不是main包则无视。
  • 文件参数,必须是main函数所在文件,生成二进制文件,文件名为源码文件名,如果不包含main函数则报错。
go install
  • 不加参数,相当于go install .
  • 未设置GOBIN,只接受目录参数,生成包对应的二进制文件(或库文件)到当前GOPATH的bin目录(或pkg)目录。
  • 已设置GOBIN,如果是目录参数则生成包对应二进制到GOBIN目录或库文件到pkg目录,文件参数(需要包含main函数)同理,只是文件名会是源码文件名。
go get 下载安装远程包(-d 参数表示仅下载)

代码结构

都在注释里了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//main.go
/*
指定代码所在的包名。
包是Golang编译和代码复用的基本单位,可以使逻辑之间保持相对独立。
包不能直接或间接相互引用,导致环状依赖。
main包是特殊的包,每个程序必须要有一个,且包内必须有一个main函数
*/
package main

/*
导入其他包。
导入名称为从src下开始到包一级的路径,src包括GOROOT下的和GOPATH下的,不同GOPATH相通
如果出现冲突需要自己起一个别名,就像下面的mymath一样,否则会屏蔽标准库的math
*/
import (
	"fmt"

	"dmstory.cn/ddm/greet"
	mymath "dmstory.cn/ddm/math"
)

func main() {	//大括号只能位于这一行
	//调用fmt包函数
	fmt.Println("Hello World!")
	/*
		简短变量声明,只能出现在函数内部。
		类型根据表达式推导
	*/
	n1 := 5
	n2 := 3
	//调用mymath包函数
	fmt.Printf("%d + %d = %d\n", n1, n2, mymath.Add(n1, n2))
	fmt.Printf("%d - %d = %d\n", n1, n2, mymath.Substract(n1, n2))
	//调用greet包函数
	greet.SayHi()
}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

//add.go,其他同理
/*
定义这份代码属于math包
*/
package math
/*
定义包当中的方法,方法名是大写表示该方法是导出的,即可以被外部访问
*/
func Add(a, b int) int {
	return a + b
}