Linux配置go环境变量/etc/profile
export GOPATH=/opt/go
export PATH=$PATH:/opt/go/bin:$GOPATH/bin
Go的优点
- 高性能,高并发
- 简单易学
- 标准库丰富
- 工具链完善
- 可以静态链接,把所有依赖库打包到一个可执行文件中运行
- 快速编译
- 支持跨平台编译运行
- 垃圾回收机制
Go主要用于以下领域:云计算,微服务,大数据,区块链
基础语法
编译:go run 编译运行,build编译成可执行文件
go是类型后置语言
变量类型:字符串,整数,浮点数,布尔型
变量声明方式:var a int = 1,短变量声明a := 1自动匹配类型; 常量声明方式const a = 1,可以自动确定类型
逻辑语句没小括号if i<3{}
循环只有for:for i:=0; i<5; i++{}
case每个分支无需break就可结束switch
switch num {
case 1,2:
fmt.Println("1")
case num>=3:
fmt.Println("0")
default:
fmt.Println("Other")
}
数组:var a [5]int,nums := [5]int{1,2,3,4,5}
切片:
- 可变长切片:
s:=make([]string, 3); - 切片新增元素,更新需要赋值
s=s.append(s,"d"); - 子切片:和python相同,s[2:8]
- 切片复制copy(c,s)
map字典:
- 建立字符串到int的映射
m:=make(map[string]int) - 可以定义初始容量
m:=make(map[string]int, 10) m["one"]=1delete(m,key)删除- 判断有无key:
v, ok := m["one"]
range:
- 遍历切片:
for i,num := range nums - 遍历字典:
for k,v := range(m)
函数func
- 可以返回多个值:
func exists(m map[string]int, k string) (v int, ok bool) - 要想被其他模块调用,函数首字母需要大写
指针:负责修改传入的参数func f(n *int){*n+=2},f(&n)
结构体
- 定义:
type user struct{name string} - 结构体方法:
func (u *user)check在func和函数名之间插入结构体,可以直接被user.check调用 - 定义对象:a := user{name: "wang", password: "1024"}
错误处理:返回参数中加入err error,例子
func findUser(users []user, name string)(v *user, err error){
for _, u := range users{
if u.name==name{
return &u,nil
}
}
return nil, errors.New("not found")
}
字符串操作:
- len("中文")=6,utf-8编码
- Contains(s,substr)是否包含子串
- Count(s,substr)统计出现次数
格式化字符串:fmt.Printf("n=%v\n", n),%v代表任意类型
json:序列化json.Marshal(struct),需要结构体每个字段首字母大写;反序列化json.Unmarshal(string,&struct)
时间处理:
- time.Now()
- t:=time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)构造时间
- t.Unix()获取时间戳
string转int:
- i, _=strconv.ParseInt(s,10,8)(返回的err用
_表示可以不处理) - .Atoi()
命令行参数的数组:os.Args
常用工具
读取标准输入
package main
import(
"fmt"
"bufio"
"os"
"strings"
)
func main(){
reader:=bufio.NewReader(os.Stdin)
input,err:=reader.ReadString('\n')//读入一行
if err!=nil{
fmt.Println("input error")
return
}
input=strings.TrimSuffix(input,"\n")//去掉换行符
fmt.Println(input)
}
生成http请求:将cURL bash请求复制到curlconverter.com,可以生成go代码。为避免资源泄漏,使用defer resp.Body.Close()在函数结束时关闭流。
oktools.net/json2go可以把输入的json字符串转为生成go结构体的代码
代理服务器:使用go process(client)启动一个线程