GO语言基础语法 | 青训营笔记

72 阅读2分钟

什么是Go语言

  1. 高性能、高并发

  2. 语法简单、学习曲线平缓

  3. 丰富的标准库

    自带很多标准库,不像其它语言一样全靠第三方库,不稳定

  4. 完善的工具链

    编译 格式化 单元测试工具等

  5. 静态链接

    默认全是静态链接,只有一个文件

  6. 快速编译

    1s增量编译

  7. 跨平台

  8. 垃圾回收

    无需考虑内存分配与释放

为什么选go

  • 性能好
  • 部署简单,学习成本低
  • 内部框架的推广

安装

  • 按官网提示安装

  • 分享一下我的:mac下直接 `brew install go` 就完了

  • IDE

    • vscode
    • goland

基础语法

一个程序的基本结构

  • 声明包
  • 导入包
  • man函数

运行

  • go run 运行
  • go build 编译
    • 然后直接运行

变量

  • 字符串是基本类型,可以直接通过相加来拼接
  • 变量声明
    1. var 名 = 值 自动推导类型
    2. 名:=值

常量

  • const 名 = 值
    • 常量没有特定类型,根据上下文推断

if else

  • if 后面是没有括号的

循环

  • 只有for
    • 死循环,只有一个for 和循环体
    • 经典循环,for i :=0; i < 0; i++ { 类型的
      • 没有括号
    • 有continue

switch

  • 无括号

  • 默认只会执行当前case

    • 避免c语言那样忘写break引起的bug
  • switch可以不写变量,放分支里当if

    switch {
    	case t.Hour() < 12:
    		fmt.Println("It's before noon")
    	default:
    		fmt.Println("It's after noon")
    }
    

数组

  • 长是固定的,一般不用一般用切片

切片

  • s := make([]string, 3)
  • 添加元素
    • s = append(s, "d")
    • 需要重新赋值
    • 因为不定长可能会发生扩容,生成一个新对象
  • 还支持像python一样的切片操作
    • 但是不支持负数索引

map

  • 哈希或字典
  • m := make(map[string]int)
    • 方括号中间是key的类型
    • 后面是value的类型
  • 写入
    • m["xxx"] = 1
  • 读取
    • v, ok = ["xxx"]
  • 删除
    • delete(m, "xxx")

range

  • 遍历数组或map
  • 数组每次遍历出来是 索引, 元素
  • map每次遍历出来是 key, value

函数

  • func 开头,返回值类型在最后

指针

  • 像c语言,但是只支持少量操作
  • 支持函数内修改
  • 某些场景下可以避免大结构体拷贝的开销

结构体

type user struct{
	name string
	password string
}
  • 全参初始化
  • 全参指定参数名初始化
  • 部分参数指定参数名初始化
  • 通过 [xx.name](<http://xx.name>) 来访问

结构体方法

  • 类似类成员函数

    func (u user) checkPassword(password string) bool{
    	return true
    }
    

错误处理

  • 可能返回error类型的结果
    • 使用 erros.New(”xxxx”) 来创建异常

字符串操作

  • 标准库 strings
  • strings.Contains(a,b) a包含b
  • strings.Count(a, b) a包含几个b
  • strings.HasPrefix(a,b) a以b为前缀
  • strings.Index(a, b) b在a中的位置
  • strings.Join(字符串数组) 分隔拼接
  • strings.Repeat(a, times) 将重复拼接times次
  • strings.Replace(a, b) 替换
  • strings.ToLower(a) 转小写
  • strings.ToUpper(a) 转大写
  • len(a) 返回字符串长度

格式化字符串

  • fmt.Println
  • fmt.Printf
    • %v
      • %+v 详细打印v
      • %#v 更详细的打印v
    • %.2f
      • 保留两位小数打印

JSON处理

  • 结构体中的首字母大小字段可以被自动处理
    • 首字母大写的变量意味着是公开的
  • json.Marshal(a)
    • 序列化
  • err = json.Unmarshal(a, &b)
    • 反序列化给b
  • 默认序列化完的变量首字母是大小
    • 增加一个默认注释
    • Age int json:"age"``

时间处理

  • time.Now()
    • 获取当前时间
  • time.Date(...)
    • 构造时间
  • diff := t2.Sub(t)
    • 返回t和t2之间的时间差
    • diff.Minutes()
    • diff.Seconds()
  • t.Format("2006-01-02 15:04:05")
    • 格式化时间t
  • t, err := time.Parse("2006-01-02 15:04:05")
    • 解析时间
  • t.Unix()
    • 获取对应的时间戳

数字解析

  • strconv
  • strconv.ParseFloat("1.234", 64)
    • 64位的浮点数
  • strconv.ParseInt("111", 10, 64)
    • 64位的10进制整数
  • strconv.Atoi("123")
    • 快速把一个十进制字符串转成数字
  • strconv.Itoa(123)
    • 快速把一个数字转成字符串

进程信息

  • os.Args
    • 进程运行时的命令行参数
  • os.Getenv("PATH")
    • 获取环境变量的值
  • os.Setenv("AA", "bb")
    • 写环境变量
  • buf, err := exec.Command
    • 快速启动子进程