Go语言基础语法 | 青训营

75 阅读2分钟

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]intnums := [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"]=1
  • delete(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)启动一个线程