这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
Go语言环境搭建
安装Go
在官网下载Go语言的安装包,然后按照要求安装即可。
安装完毕后,需要添加系统环境变量
GOROOT,其值为Go的安装目录(安装过程中可以自定义),以及在Path里加上安装目录下的bin目录,然后在cmd中输入go version。
然后就是配置IDE,我选择的是vscode。需要安装Go插件;并且安装插件依赖工具:调出命令面板输入go install tools,选择Go: Install/Update Tools。
工作空间
Go的工作空间是由GOPATH环境变量指定的,在Go早期版本,GOPATH是必须的,即所有的Go项目代码都要保存在GOPATH指定的目录下。但是后面Go引入了Go Module,使用Go Module管理的项目可以放在GOPATH之外。
工作空间是Go比较特别的地方,它要求所有的项目代码都要放在工作空间中,包括自己写的项目代码以及从外部获取的代码可以存在该空间内。工作空间中存在三个文件夹:
src:存放项目源代码pkg:存放编译生成的代码bin:存放编译生成的可执行代码
在Go中,是将每一个项目都当作$GOPATH\src的一个包来看待,工作空间的概念就有点类似于Java中的classpath。
classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class。很多教程在配置Java环境时都会在系统变量中加上
CLASSPATH环境变量,其中.代表当前目录。详见classpath和jar。
在
Go中,GOPATH的作用就是指示一个工作空间:当Go编译文件时,在工作空间中搜索需要的包。
相关文章:Can someone explain why GOPATH is convenient and how it should be used in general?
Go语言基础
变量
定义变量有多种方式:
var <varName> <varType> = <value>var <varName> = <value>varName := value
var var1 string = "go"
var var2 = 10
var3 := true
// 常量就是将var换成const
const const1 = 0
_是一个特殊的变量名,任何赋予它的值都会被丢弃。Go对于已声明但未使用的变量会在编译阶段报错
数据类型
int8, int16, int32(rune), int64 // 有符号整数
uint8(byte), uint16, uint32, uint64 // 无符号整数
bool // 布尔类型
float32, float64 // 浮点数
complex64, complex128 // 复数 一半位数作实数,一半位数作虚数
string // 字符串
不同类型之间的变量不允许相互赋值或操作,例如
int和int32之间的赋值
数据结构
-
array:静态数组(数组长度不可变)// var <arrayName> [<size>]<typeName> var arr [10]int // <arrayName> := [<size>]<typeName>{<initVals>} a := [3]int{1, 2, 3} b := [...]int{1, 2} // 自动根据元素个数来计算长度 -
slice:动态数组// 声明方式和array相比就是少了[]中的长度 var slice []int var s1 := []int{1, 2, 3} // 可以通过append来向slice中增加内容 s1 = append(s1, 3) // [1, 2, 3, 3] -
map:字典// var <mapName> map[<keyType>]<valueType> var m map[string]int // <mapName> := make(map[<keyType>valueType]) mp := make(map[string]int) m1 := map[string]int{"c":1, "c++":2, "go":3}
控制流
在
Go有if-else、for、switch-case三大结构,唯一需要注意的是Go中条件表达式不需要用括号包裹。
// if-else
i := 1
if i > 0 {
// ...
} else {
// ...
}
// for
for i := 0; i < 10; i ++ {
// ...
}
// switch-case
switch i {
case 1: // ....
case 2: // ...
// ...
default: // ...
}
函数
/*
func funcName(arg1 type1, arg2 type2, ... ) (ret1 type1, ret2 type2) {
// ...
}
*/
func add(a int, b int) (res int, ok bool) {
// ...
}
fmt
import "fmt"
fmt.Println() // 打印一行
fmt.Printf("%v", s) // 所有类型的变量都是用v通配符
fmt.Printf("%+v", s) // 输出关于s变量的详细信息
fmt.Printf("%#v", s) // 更加详细
f := 3.1415
fmt.Printf("%.2f", f)
拥有以上知识基本上就可以写一些简单的程序了