这是我参与「第四届青训营 」笔记创作活动的的第2天
由于青训营的项目笔者打算用GO实现,于是快马加鞭开始了学习之旅,下面我将介绍golang的基础知识。
包
用package关键字定义一个包名,import导入其他的包,主函数的包名定义为main
package main
import(
"fmt"
"math/rand"
"time"
)
导入包之后,就可以使用在外部定义的函数,但要记住,只有首字母大写的函数才能给其他包调用。
编译和运行
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
a := rand.Intn(10)
b := rand.Intn(10)
switch {
case a > b:
fmt.Printf("%d > %d", a, b)
case a < b:
fmt.Printf("%d < %d", a, b)
default:
fmt.Printf("%d = %d", a, b)
}
}
//一段完整的代码
在window操作系统下,win+R输入cmd打开,将工作目录切换到我们代码所在的目录下输入
go build 文件名.go
执行成功后会在本地生成可执行文件,输入文件名运行即可
./文件名
变量
变量的声明方式:
var a int64 = 2
var b bool
c := "study"
//短变量声明只能在函数中使用
声明一个变量时,如果没有赋初值,系统会自动给他分配这个类型是零值,数值类型的(如int)零值为0,bool类型的零值为false,字符串类型的零值为“”,其他如指针、切片、函数、接口(interface)这一类的零值为nil。
数组(array)
var arr = [3]int{1, 2}
//这里只赋了前两个值
fmt.Println(arr)
arr[2] = 4
fmt.Println(arr)
//输出: [1 2 0]
// [1 2 4]
用复合声明一个数组:
arr := [...]int{1, 2}
//用"..."代替指定数组大小,go会自己统计元素的个数
fmt.Println(arr)
//输出: [1 2]
数组的大小是固定的,与之相比,slice就更加灵活
切片(slice)
slice与array类似,但不同的是,slice是引用类型,每一个slice总会指向底层的一个array
//在数组或者切片上截取一段切片array[n:m],含有元素n到m-1
arr := [...]int{1, 2, 3, 4}
s1 := arr[1:2]
//s1 = [2 3]
s2 := arr[:]
//s2 = [1 2 3 4]
//或者直接声明一个切片
var sli = make([]int, 4)
sli[0] = 1
//sli = [1 0 0 0]
slice还可以扩容,如果指定了cap(容量)这一属性,那么在使用append往切片中添加元素时,只要切片的len(长度)没有超过cap,那么这些切片共用底层同一个数组,如果修改一个切片的值,其他切片的值也会跟随着改变。
var sli = make([]int, 2, 4)
//2是切片的长度(len),4是容量(cap)如果不指定cap则默认cap=len
sli[0] = 1
sli[1] = 2
cop := sli
sli = append(sli, 3, 4)
cop = append(cop, 4, 5)
fmt.Println(sli)
fmt.Println(cop)
//输出 [1 2 4 5]
// [1 2 4 5]
sli = append(sli, 6)
sli[2] = 7
fmt.Println(sli)
fmt.Println(cop)
//输出 [1 2 7 5 6]
// [1 2 4 5]
控制结构
go中的控制结构较少,主要有for,if-else,switch,还有用于协调channal管道间通讯的select结构。
- if-else
if err != nil {
return err
//错误信息返回
}
if x > y {
return x
} else {
return y
}
在if-else语句中也可以初始化变量
rand.Seed(time.Now().Unix())
//随机数种子
if x := rand.Intn(10); x > 5 {
return true
} else {
return false
}
- for
for循环主要有3种形式:
for i := 1; i < 10; i++ {
fmt.Println(i)
//打印数字1-9
}
//与C的for类似
i := 1
for i < 10 {
fmt.Println(i)
i++
//打印数字1-9
}
//相当于while
i := 1
for {
if i > 9 {
break
} else {
fmt.Println(i)
i++
//打印数字1-9
}
}
//死循环,需要用break,return之类退出
- switch
一般的switch形式:
switch i{
case 0:
fmt.Println("zero")
fallthrough
//fallthrough表示匹配成功后,switch还会继续执行下一个case中的内容
case 1:
fmt.Println("one")
//xxxx
default:
//与前面的选项都不匹配时,就会执行default中的语句
}
也可以不指定switch后的表达式,这时switch会匹配case后的语句是否为True
switch {
case a > b:
fmt.Println("a > b")
case a < b:
fmt.Println("a < b")
default:
fmt.Println("a = b")
}