golang.md 8.5 KB


2022/01/21

go语言学习

2007年9月开始设计,2009年11月推出

每年半年发布一个二级版本

  • Go 1.0 — 2012 年 3 月 Go 的第一个版本,带着一份兼容性说明文档来保证与未来发布版本的兼容性,进而不会破坏已有的程序

  • Go 1.1 — 2013 年 5 月 这个 Go 版本专注于优化语言(编译器,gc,map,go 调度器)和提升它的性能

  • Go 1.2 — 2013 年 12 月 本版本中 test 命令支持测试代码覆盖范围并提供了一个新命令 go tool cover ,此命令能测试代码覆盖率

  • Go 1.3 — 2014 年 6 月: 这个版本对栈管理做了重要的改进。栈可以申请连续的内存片段,提高了分配的效率,使下一个版本的栈空间降到 2KB

  • Go 1.4 — 2014 年 12 月: 此版本带来了官方对 Android 的支持,golang.org/x/mobile ) 让我们可以只用 Go 代码就能写出简单的 Android 程序 Go 也提供了 go generate 命令通过扫描用 //go:generate 指示的代码来简化代码生成过程

  • Go 1.5 — 2015 年 8 月: 实现了自举 这个新版本,发布时间推迟了两个月,目的是在以后每年八月和二月发布新版本 这个版本对 gc 进行了重新设计 这个版本也发布了运行时追踪,用命令 go tool trace 可以查看

  • Go 1.6 — 2016 年 2 月: 这个版本最重大的变化是使用 HTTPS 时默认支持 HTTP/2 在这个版本中 gc 等待时间也降低了

  • Go 1.7 — 2016 年 8 月: 这个版本发布了 context 包,为用户提供了处理超时和任务取消的方法 对编译工具链也作了优化,编译速度更快,生成的二进制文件更小,有时甚至可以减小 20% 到 30%

  • Go 1.8 — 2017 年 2 月: 把 gc 的停顿时间减少到了 1 毫秒以下:其他的停顿时间已知,并会在下一个版本中降到 100 微秒以内 这个版本也改进了 defer 函数

  • Go 1.9 — 2017 年 8 月: 这个版本支持下面的别名声明:type byte = uint8 sync 包新增了一个 Map 类型,是并发写安全的

  • Go 1.10 — 2018 年 2 月: test 包引进了一个新的智能 cache,运行会测试后会缓存测试结果。如果运行完一次后没有做任何修改,那么开发者就不需要重复运行测试,节省时间。 为了加快构建速度,go build 命令现在也维持了一份最近构建包的缓存。

  • Go 1.11 — 2018 年 8 月: 带来了一个重要的新功能包管理:Go modules 第二个特性是实验性的 WebAssembly,为开发者提供了把 Go 程序编译成一个可兼容四大主流 Web 浏览器的二进制格式的能力

  • Go 1.12 — 2019 年 2 月: 基于 analysis 包重写了 go vet 命令,为开发者写自己的检查器提供了更大的灵活性

  • Go 1.13 — 2019 年 9 月: 改进了 sync 包中的 Pool,在 gc 运行时不会清除 pool。它引进了一个缓存来清理两次 gc 运行时都没有被引用的 pool 中的实例。 重写了逃逸分析,减少了 Go 程序中堆上的内存申请的空间。

  • Go1.14 - 2020 年 2 月: 现在 Go Module 已经可以用于生产环境,鼓励所有用户迁移到 Module。 该版本支持嵌入具有重叠方法集的接口。 性能方面做了较大的改进,包括:进一步提升 defer 性能、页分配器更高效,同时 timer 也更高效。 Goroutine 支持异步抢占。

  • Go1.15 - 2020 年 8 月: Go 链接器现在具有更低的资源使用量,更快的速度以及更高的代码质量。通常,对于大型Go应用程序,链接过程比之前快 20% 左右,而内存使用消耗减少 30% 左右. Go 1.15 二进制文件比Go 1.14 小约5%. Go 对 ARM / ARM64 有了更好的 OpenBSD 支持 现在使用更高内核数的系统,分配的小对象要比之前版本快很多.

  • Go 1.16 — 2021 年 2 月: embed 包和 //go:embed 指令 增加对 macOS ARM64 的支持 默认启用 Module io/fs 包,不建议使用 io/ioutil 了,因为其中的内容移到 os 和 io 包了

  • Go 1.17 — 2021 年 8 月: 基于寄存器的调用惯例替代基于堆栈的调用惯例 增加对 Windows ARM64 的支持 新的 //go:build 新版构建约束格式化支持 go.mod 优化 标准库的一些改进

  • Go1.18 - 2022 年初: 如果您正在更新您的软件包以使用泛型,请考虑将新的泛型API隔离到自己的文件中,并为其使用Go 1.18的构建标签(//go:build go1.18),以便Go 1.17用户可以继续构建和使用非泛型部分。

  • 线上编译环境https://go.dev/play/

  • 本地编译环境

    • goup(功能方便;对于国内网络比较友好)

    • https://github.com/owenthereal/goup

    • 如果用线上脚本安装不成功,就用手动安装

    • ```shell ~ % goup --help The Go installer

      Usage: goup [flags] goup [command]

      Available Commands: default Set the default Go version help Help about any command install Install Go with a version ls-ver List Go versions to install remove Remove Go with a version show Show installed Go upgrade Upgrade goup version Show goup version

      Flags: -h, --help help for goup -v, --verbose Verbose

      ~ % goup install 1.17.6

      ~ % goup show | VERSION | ACTIVE | |-----------|--------| | 1.17.6 | | | 1.18beta1 | * |

      ~ % go version go version go1.18beta1 darwin/arm64

  • go语言主要特征

    • 首字符可以是任意的Unicode字符或者下划线;剩余字符可以是Unicode字符、下划线、数字
  • 关键字

  •   break        default      func         interface    select
      case         defer        go           map          struct
      chan         else         goto         package      switch
      const        fallthrough  if           range        type
      continue     for          import       return       var
    
  • 保留字

  •   Constants:    true  false  iota  nil
      
      Types:    int  int8  int16  int32  int64  
                uint  uint8  uint16  uint32  uint64  uintptr
                float32  float64  complex128  complex64
                bool  byte  rune  string  error
      
      Functions:   make  len  cap  new  append  copy  close  delete
                   complex  real  imag
                   panic  recover
    
  • 可见性

  •   1)声明在函数内部,是函数的本地值,类似private
      2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect
      3)声明在函数外部且首字母大写是所有包可见的全局值,类似public
    
  • 声明方式:var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。

  • 包管理 mod

  • 编译


  • Golang内置类型和函数

    • 值类型

    • bool
      int(32 or 64), int8, int16, int32, int64
      uint(32 or 64), uint8(byte), uint16, uint32, uint64
      float32, float64
      string
      complex64, complex128
      array    -- 固定长度的数组
      
    • 指针类型

    • slice   -- 序列数组(最常用)
      map     -- 映射
      chan    -- 管道
      interface
      fonc
      
    • 内置函数

    • append          -- 用来追加元素到数组、slice中,返回修改后的数组、slice
      close           -- 主要用来关闭channel
      delete          -- 从map中删除key对应的value
      panic           -- 停止常规的goroutine  (panic和recover:用来做错误处理)
      recover         -- 允许程序定义goroutine的panic动作
      real            -- 返回complex的实部   (complex、real imag:用于创建和操作复数)
      imag            -- 返回complex的虚部
      make            -- 用来分配内存,返回Type本身(只能应用于slice, map, channel)
      new          -- 用来分配内存,主要用来分配值类型,比如int、struct。返回指向Type的指针
      cap          -- capacity是容量的意思,用于返回某个类型的最大容量(只能用于slice和 map)
      copy            -- 用于复制和连接slice,返回复制的数目
      len             -- 来求长度,比如string、array、slice、map、channel ,返回长度
      print、println  -- 底层打印函数,在部署环境中建议使用 fmt 包