# 编译
go run hello.go // 执行go语言代码
go build hello.go // 编译go语言代码,生成二进制文件
./hello // 执行二进制文件
# 变量声明
变量
var s string = '1'
var s1, s2 string = '1', '2'
var i := 1
// 这种不带声明格式的只能在函数体中使用
a, b := 123, "123"
常量
const a int = 1
// 枚举
const (
Unknown = 0
Female = 1
Male = 2
)
const (
a = iota
b = iota
c = iota
)
const (
a = iota
b
c
)
# 函数
func function_name (param) retun_type {
return xxx
}
# 数组
var balance [10] float32
balance := [5]float32(1,2,3,4,5)
balance := [...]float32(1,2,3,4,5)
balance := [5]float32(1:2,3:6)
# 切片
其实就是动态数组,go中数组长度不可改变
var slice1 []type = make([]type, len)
var s []int = []int{}
s:=[]int{1,2,3}
s := arr[startIndex:endIndex]
# 范围
nums := []int{1,2,3}
sum := 0
for _, num := range nums{
sum += num
}
# 指针
var ptr *int // 指针变量
var a int = 1
ptr = &a
// ptr存储的是变量地址,类似于:20818a220
// *ptr访问的是指针变量的值,这里是 a 的值:1
# 结构体
type Book struct {
title string
author string
}
book := Book{"Go" "go"}
book1 := Book{title: "go", author: "go"}
// 访问方式一模一样,结构指针看起来很鸡肋
var bookPoint *Book = &book1
bookPoint.title
# 集合
// 创建集合
var m1 map[string]string
m1 = make(map[string]string)
m1 := map[string]string{"a": "a", "b": "b"}
m1["a"] = "a"
delete(m1, "a")
# 类型转换
float32(xxx)
# 接口
// 定义接口
type Phone interface {
call()
}
// 定义struct
type NokiaPhone struct {
}
// 定义实现
func (nokiaPhone NokiaPhone) call() {
fmt.Println("I am Nokia, I can call you!" + nokiaPhone.title)
}
# 错误处理
# 并发
// 使用关键字go调用一个函数,开启goroutine
// 其实就是开启一个新线程
go f("a")
// 声明通道
ch := make(chan int)
// 传递数据
ch <- v // 把v发送到通道ch
v := <-ch // 从ch接收数据赋值给v
// 遍历通道数据
for i := range ch {
fmt.Println(i)
}
// 发送端会一直阻塞直到发出数据
// 接收端会一直阻塞直到接收到数据
// 如何持续接收数据?如何像event的方式一样接收数据?
// 感觉没有async和await那样直观、方便
# 设置代理
启用 Go Modules 功能
go env -w GO111MODULE=on
# 配置 GOPROXY 环境变量,以下三选一
# 1. 七牛 CDN
go env -w GOPROXY=https://goproxy.cn,direct
# 2. 阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 3. 官方
go env -w GOPROXY=https://goproxy.io,direct
# mod
基本命令:
go mod init helloworld // 初始化module
go mod tidy // 下载缺少的包
go list -m -u all // 检查可以升级的package
go get -u // 升级所有依赖
go get package@version // 升级指定包到指定版本
发布包:
go mod init github.com/Thyiad/gopackage // 初始化module
git tag v0.0.1
git push --tags // push到github上
git checkout v0.0.1 // 签出v0.0.1,但因为不是branch,提交后只能通过确切的提交哈希访问
# 零散点
导入同名包:
import (
"text/template"
htemplate "html/template" // this is now imported as htemplate
)