## Go语言上手-基础语法 | 青训营笔记

74 阅读3分钟
  • 这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

1. 重点内容

  • 开发环境配置
  • Golang基础语法
  • Golang标准库

2. 知识点

2.1 Go语言特点
  1. 简洁、快速、安全
  2. 高并发、开源
  3. 内存管理、数组安全、快速编译
2.2 开发环境
  1. 配置集成开发环境
  2. 基于云的开发环境
2.3 基础语法
  1. 数据类型

    • 变量

      Go语言中变量可以通过var name type:=声明,其中type可以省去。

      var a = "initial"
      var b, c int = 1, 2
      var d = true
      var e float64
      f := float32(e)
      g := a + "foo"
      
    • 常量

      常量使用const name type进行声明,无确定类型

      const s string = "constant"
      const h = 500000000
      
  2. 条件/循环语句

    • if else

      Go语言中条件语句类似于C/C++,但后面必须接大括号,if和语句不能在同一行。

      if condition {
          statements
      }
      
    • for循环 for为Go语言中唯一的一种循环,类似于C/C++中的for,for后面不写则为死循环。可以通过breakcontinue跳出或继续循环。

      for init-statement; condition; inc-expression {
       statements
          }
      
    • switch

      在Go语言中的switch中,不需要加break进行跳出,并且可以支持任意变量类型。switch后面的条件语句可以省略,在case后写条件语句,可以代替if else语句。

      switch condition {
          case condition:
          default:
      }
      
  3. 基本数据结构

    • 数组和切片

      Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),切片通过make([]T, length, capacity)函数创建切片,其中capacity为指定容量(可选),使用方法类似于数组,可以通过append()函数追加元素。

      //数组
      var a [5]int
      b := [5]int{1, 2, 3, 4, 5}
      // 切片
      s := make([]string, 3)
      s = append(s, "d")
      
    • map

      Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

      // map创建
      m := make(map[key_type]value_type)
      m2 := map[string]int{"one": 1, "two": 2}
      // map删除
      delete(m, "one")
      
    • 结构体

      结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

      type struct_variable_type struct {
          member definition
          ...
          member definition
      }
      
    • 字符串

      在标准库strings中有很多常用的字符串工具函数。

      通过fmt中的printf函数有很多与字符串格式相关的方法。

  4. 指针与函数

    • 指针

      var var_name *var-type
      
    • 函数

      func function_name( [parameter list] ) [return_types] {
         statements
      }
      
  5. 错误处理

    • Go语言中符合语言习惯的处理方法使用一个单独的返回值来传递错误信息。

      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")
      }
      // 返回的第二个值为错误信息。
      
  6. Json和时间处理

    • JSON处理

      对于每个字段的第一个字母为大写的结构体,可以通过JSON.marshaler()函数序列化,JSON.unmarshaler()可以进行反序列化到空的变量里。可以通过json tag等修改JSON结果里的字段名。

    • 时间处理

      now := time.Now()   // 2022-03-27 18:04:59.433297 +0800 CST m=+0.000087933
      diff := t2.Sub(t)   // 对时间进行减法
      
  7. 数字解析与进程信息

    • 数字解析

      在Go语言中,可以通过STR conv包下的strcon解析字符串,也可以用Atoi函数将数字转换为字符串。

    • 进程信息

      通过os.argv可以获得程序执行时指定的命令行参数。

3. 实战练习

3.1 猜谜游戏
3.2 在线字典
3.3 SOCKS5 代理