GO 基础环境和语法 | 青训营笔记

91 阅读2分钟

环境配置

在 PowerShell 中执行 go env -w GOPROXY=https://goproxy.cn 以使用国内源. 利用 VSCode 开发, 直接安装对应的拓展并执行即可.

编程中

需要 import 时直接输入对应的函数即可, 会自动导入. 保存时会清空未使用的变量.

语法

变量

  • const 声明常量.
  • var 声明变量.
  • 声明时用 = 指定值.
  • ${varName}:=${expression} 的方式也可以创建变量.
  • 创建变量和常量时可以指定类型, 格式: ${keyword} ${varName} ${type} = ${expression}
  • 字符串和其他类型的加法可以自动转换.
  • 类型转换语法同 Python.
  • int 变量默认为 0.

选择

  • 和 C++ 相同, 去掉括号.
  • 不能直接使用 int 等类型作为布尔表达式.
  • if 后可以接一个普通语句, 在分号后再写要判断的布尔表达式.

循环

只有 for 循环, 也不需要括号.

  • 可以使用 break, continue 来控制循环进行.
  • 死循环: 不接任何语句.
  • 三句式同 C++ 的 for 循环.
  • 一个布尔表达式则为 while 循环.
  • 对可迭代对象: for index[, elem]: range array|slice, for key[, value] := range map

switch 语句

  • 不需要括号和 break.
  • 多个条件用逗号分割.
  • 可以使用类似 Kotlin 中 when 语句的写法, 代替分支操作.

数组

  • 类型形如 [2][3]int.
  • len 函数获取长度.

切片

  • len 函数获取长度.
  • 声明方法: make([]${elemType}, ${length}) 或者 []${elemType}{${elem}...}
  • 追加方法: ${varName} = append(${varName}, ${elem}...)
  • 复制方法: copy(${to}, ${from})
  • 切片方法同 Python. 注意: 不能使用负数下标.

字典/映射(无序)

  • len 函数获取长度.
  • 声明方法:make(map[keyType]valueType) 或者 map[keyType]valueType{${keys}:${values}...}
  • 获取不存在的 key 时不会报错, 检验方法: value, ok := m[key], oktrue 则该 key 存在.

函数

  • func fName(kw type) returnType {}. returnType 可以为元组.

指针

  • 声明方法: *type
  • 使用: & 取地址, * 取值.

结构体

  • type NAME struct {}
  • 变量默认为 public
  • 可以使用指针和方法
  • 方法声明: func (name [*]structType) ... 使用指针才能对结构体修改.

错误处理

一般使用单独的返回值来处理错误, 类型为 error, 无错误直接返回 nil, 否则使用 errors.New 函数来创建一个错误.

字符串操作

需要导入 strings.

  • 转小写 string ToLower(string)
  • 转大写 string ToUpper(string)
  • 包含 bool Contains(string, string)
  • 计数 int Count(string, string)
  • 前缀 bool HasPrefix(string, string)
  • 后缀 bool HasSuffix(string, string)
  • 下标 int Index(string, string)
  • 连接 string Join([]string, string@sep)
  • 切分 []string Split(string, string@sep)
  • 重复 string Repeat(string, int)
  • 替换 String Replace(string, string@from, string@to, int@lim 若最后一个参数小于 00 则无限替换.

注意 len(string) 中一个汉字可以对应多个"字符".

字符串格式化

使用 %v 格式化任意类型变量, 使用 %+v 得到详细输出, %#v 得到更详细输出.

JSON

  • json.Marshal(struct) 获得序列化的 buffer, 转化为 string 后可以输出.
  • json.Unmarshal(buffer, *struct) 反序列化, 将数据输入到变量中.
  • 在结构体中声明变量时可以为其指定 JSON 下的名称, 在类型标识符后加 json:"name" 即可.

时间

  • time.Now() 获取现在时间.
  • time.Date(int@year, int@month, int@day, int@hour, int@minute, int@second, int@ms, time.UTC) 生成指定时间.
  • 两个时间可以相减获取一个时间段. 语法: t1.Sub(t2)
  • 格式化时间: 使用特定日期: 2006-01-02 15:04:05
  • time.Parse(string@format, string@time) 解析时间.
  • t.Unix() 获取时间戳.

数字与字符串

使用 strconv 来操作.

  • ParseInt(string, int@r, int) 按指定的进制转换, 若进制为0或者不写则自动推导. 最后一个参数代表返回值的精度大小 (二进制位).
  • Atoi 快速 10 进制字符串转数字.

运行参数

  • os.Args 显示运行命令的参数.
  • os.Getenv(key)os.Setenv(key, value) 来获取/写入环境变量.
  • exec.Command(args...) 调用终端命令. 返回值可以通过 ~.CombinedOutput() 获取运行结果, 类型为 buffer.