package main
import("fmt")funcmain(){
fmt.Print("Hello World!")}// 执行go run main.go// 使用 go build 生成二进制文件go build main.go./main
go module
go env
go env -w GO111MODULE=on
go env -w GOPROXY=
https://mirrors.aliyun.com/goproxy/
https://goproxy.cn,direct
GOSUMDB //检验代码包是否完整
GONOSUMDB
GONOPROXY
GOPRIVATE
// 若第三方库为私有库,该仓库无需通过 proxy 下载
流程:
0. 开启 GO111MODULE、设置 GOPROXY 等
1. 创建项目文件夹 project/2. 创建模块文件夹 module/3. 在 module/ 使用 go mod init 名字 生成 go.mod 文件
常用指令:
go mod init
go mod tidy //更新依赖文件go mod download
go mod vendr //将依赖转移至本地的 vendor 文件go mod verify //校验依赖go mod edit //手动修改依赖文件
var a int a =10var b =10
c :=10var d,e,f =1,2,3// " := " 不可以在已声明变量使用// 变量声明必须使用
常量
const a int=10// iota 特殊常量, 可以认为是一个可以被编译器修改的常量,// 只能在 const 中使用const(
a = itoa // 初始化 1
b // itoa + 1
c // itoa + 1
d ="ha"// itoa + 1
e
f =100
g
h = itoa // 恢复计数 itoa + 1
i
)// 结果012 ha ha 10010078
条件语句
// --------------------- if --------------------- //var a int
fmt.scanf("%d",&a)if a>10{
fmt.Println("a > 10")}elseif a <=10{
fmt.Println("a <= 10")}// --------------------- switch --------------------- //switch i := b.(type){casenil:
fmt.Println("b is nil")caseint:
fmt.Println("b is nil")default:
fmt.Println("b is string")}// --------------------- fallthrough 强制执行后面的 case 语句 --------------------- //switch i :=10{case5:
fmt.Println("b is 5")case10:
fmt.Println("b is 10")fallthroughdefault15:
fmt.Println("b is 15")}// b is 10 // b is 15 // --------------------- select --------------------- //// 类似 switch,但只能用于管道 channel// 每个 case 必须是一个通道操作,要么是发送要么是接收.// 任意一个通道可以运行,select 就执行;没有则执行 default,没有 default 则阻塞package main
import"fmt"funcmain(){
ch1 :=make(chanstring)
ch2 :=make(chanstring)gofunc{for{
ch1 <-"ch1"}}()gofunc{for{
ch2 <-"ch2"}}()for{select{case msg1 :=<-ch1:
fmt.Println(msg1)case msg2 :=<-ch2:
fmt.Println(msg1)default:
fmt.Println("no message received")}}}
循环
// ------------------- 迭代 ------------------- //for key, value := rang smap {}// ------------------- 正常 ------------------- //for i :=10; i >0; i--{}// ------------------- 类 while ------------------- //
i :=20for i >10{
i--}// ------------------- break select 也可以使用 return ------------------- //// 可使用 标记
re:for i:=10;i>8;i--{break re
}
// 固定长度、特定类型// slice 切片,可改变长度的数组var a [3]int=[3]int{1,2,3}// or
a :=[3]int{1,2,3}
r :=[...]int{99:-1}// 赋值第 99 个为 -1,其余为 0// 根据初始化值确定长度
a :=[...]int{1,2,3,4,5}//此时长度为 5// 类型包含长度,如 [3]int 和 [4]int 不是同一种类型
// main 为主协程,所有的新开协程都是基于 mainfuncnewTask(){
i :=1for{
i++
fmt.Println("newTask i = %d\n", i)
time.Sleep(1* time.Second)}}funcmain(){
i :=1gonewTask()for{
i++
fmt.Println("main i = %d\n", i)
time.Sleep(1* time.Second)}}// newTask i = 1// main i = 1// newTask i = 1// main i = 1// ...
若将 main 中的 for 去掉,可能结果
// newTask i = 1
因为 main 执行完毕就会退出,顺带结束 newTask()// sync.WaitGroup 等待执行完毕var wg sync.WaitGroup
funcnewTask_wg(){defer wg.Done()//任务完成时 -1}funcmain(){
wg.Add(1)// 创建任务时 +1gonewTask_wg()
wg.Wait()// 阻塞等待所有任务完成}