3月15号 Go 1.18 正式版发布 了解最新特色以及使用方法

2022年3月15日 244点热度 0人点赞 0条评论

3月15号 Go 1.18 正式版发布 了解最新特色以及使用方法

linux 下载安装 go1.18

(1)下载

curl -o go1.18.linux-amd64.tar.gz  https://dl.google.com/go/go1.18.linux-amd64.tar.gz

(2)新的go版本的文件夹

(这里可以替换为你想要的目录)

mkdir ~/go1.18

(3)解压文件到新版本文件夹

(这里可以替换为你想要的目录)

tar zxvf go1.18.linux-amd64.tar.gz -C ~/go1.18

(4)修改环境变量为新版本

vim /etc/profile
#根目录(这里可以替换为你想要的目录)
export GOROOT=$HOME/go1.18
#bin目录
export GOBIN=$GOROOT/bin
#工作目录
export GOPATH=/root/src.go
export PATH=$PATH:$GOPATH:$GOBIN:$GOROOT

(5)刷新环境变量配置

source /etc/profile

(6) 查看go版本

$ go version
go version go1.18 linux/amd64

更新成功

可能出现的问题1: 环境变量重新连接后被重置

bash的话将环境变量配置到 ~/.profile 或者~/.bash_profile

zsh的话将环境变量配置 ~/.zshrc

因为重开终端会自动执行他们

(7) vscode 需要重新安装 go tools

一般使用 vscode + ssh 远程开发

go版本更新后原来的 go tools 可能不可用, 我们需要重新安装 go tools

点击设置->command-pallet..(命令面板)->输入 go tools -> 全部选择 -> update

图片
image-20220316130845159
图片
image-20220316130901515

泛型 generic

泛型小案例: 多类型支持的hashmap

func Test泛型generic(t *testing.T) {
 //[string,string] 类型的 hashmap
 hashmap1 := &HashMap[stringstring]{hashmap: make(map[string]string)}
 hashmap1.Set("k1""v1")
 value, _ := hashmap1.Get("k1")
 fmt.Printf("value2: %v,type=%T\n", value, value)
 //[string,int] 类型的 hashmap
 hashmap2 := &HashMap[stringint]{hashmap: make(map[string]int)}
 hashmap2.Set("k1"1)
 value2, _ := hashmap2.Get("k1")
 fmt.Printf("value2: %v,type=%T\n", value2, value2)
 // value2: v1,type=string
 // value2: 1,type=int
}

type HashMap[K comparable, V any] struct {
 hashmap map[K]V
}

func (h *HashMap[K, V]) Set(key K, value V) {
 h.hashmap[key] = value
}
func (h *HashMap[K, V]) Get(key K) (value V, ok bool) {
 value, ok = h.hashmap[key]
 return value, ok
}

模糊测试 fuzzing

  • fuzzing testing 模糊测试的设计和泛型一样存在了很长时间

  • fuzzing testing 模糊测试/随机测试会随机或者根据开发人员的初始数据随机数据并持续性的测试软件的可靠性

  • go test工具链目前的成员有: 单元测试test、性能基准测试bench, 模糊测试fuzzing

模糊测试小案例

package main

import (
 "fmt"
 "testing"
 "unicode/utf8"

 "github.com/stretchr/testify/assert"
)

//字符串反转函数(待测试)
func Reverse(s string) string {
 b := []byte(s)
 for i, j := 0len(b)-1; i < len(b)/2; i, j = i+1, j-1 {
  b[i], b[j] = b[j], b[i]
 }
 return string(b)
}

//普通单元测试
func TestReverse(t *testing.T) {
 testcases := []struct {
  in, expect string
 }{
  {"Hello, world""dlrow ,olleH"},
  {" "" "},
  {"!12345""54321!"},
 }
 for _, tc := range testcases {
  actual := Reverse(tc.in)
  assert.Equal(t, tc.expect, actual)
 }
}

//模糊测试,和单元测试相辅相成
// go test -fuzz=Fuzz -run ^FuzzReverse$  -v
//会生成 testdata 里面有崩溃的测试数据,Fial的数据
func FuzzReverse(f *testing.F) {
 testcases := []string{"Hello, world"" ""!12345"}
 for _, tc := range testcases {
  f.Add(tc) // Use f.Add to provide a seed corpus
 }
 f.Fuzz(func(t *testing.T, orig string) {
  fmt.Printf(".")
  rev := Reverse(orig)
  doubleRev := Reverse(rev)
  if orig != doubleRev {
   t.Errorf("Before: %q, after: %q", orig, doubleRev)
  }
  if utf8.ValidString(orig) && !utf8.ValidString(rev) {
   t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
  }
 })
}


工作区 workspace

举个例子

我要更新一个工具模块 tools, 并在项目中看这个模块更新的效果, 一般的做法是修改 go.mod 文件, 使用 replace github上的tool库替换到自己的本地目录, 然后本地修改的效果就能实时在项目中现了

模块修改成功后, 如果这个项目不将 go.mod 改回来的话推上去的一定是编译失败的

工作区模式 workspace 可以在在 go.mod 的上级目录封装一层独立的 go.work, 在这个文件里面 replace 替换,不要修改原有项目的 go.mod 文件

工作区示例

项目目录如下

workspace-demo
├── project
│   ├── go.mod      // 项目模块,mod子模块
│   └── main.go
├── go.work         // 工作区,work上层模块
└── tools
    ├── fish.go
    └── go.mod      // 工具模块,mod子模块

初始化工作区

# 新建工作区文件夹
mkdir workspace-demo
cd workspace-demo
# 克隆项目 project 和开发的模块 tools, 这里仅作参考,请替换为合适的 git 仓库
git clone https://github.com/me/project
git clone https://github.com/me/tools
# 初始化工作区
go work init ./project ./tools

修改 go.work 并且 replace 远程 tools 模块到本地

go 1.18

use (
        ./project
        ./tools
)
//修改远程模块为本地替换
replace github.com/me/tools => ./tools

性能提升

苹果M1、ARM64和PowerPC64用户肯定会欢欣鼓舞! 由于Go 1.17的寄存器ABI调用约定扩展到这些架构,Go 1.18的CPU性能提升幅度高达20%。为了强调这个版本的性能提升幅度,我们将20%的性能改进作为了第四个最重要的标题

关于1.18中的所有内容的更详细描述,请查阅Go 1.18发布说明。

reference

Go 1.18 Release Notes - The Go Programming Language golang.org

https://tip.golang.org/doc/go1.18

Linux上Golang 版本升级_线上幽灵的博客-CSDN博客

https://blog.csdn.net/chen134225/article/details/117134517

官方教程:Go泛型入门 - SegmentFault 思否

https://segmentfault.com/a/1190000041140246

Go 1.18版本正式发布了 | Tony Bai

https://tonybai.com/2022/03/16/go-1-18-released/

Go 1.18新特性前瞻:原生支持Fuzzing测试 qq.com

https://mp.weixin.qq.com/s/5qnIUz3plQG65FVnbPZVLw

Go 1.18新特性前瞻:Go工作区模式 | Tony Bai

https://tonybai.com/2021/11/12/go-workspace-mode-in-go-1-18/

Go1.18 新特性:多 Module 工作区模式-51CTO.COM

https://developer.51cto.com/article/699600.html

739003月15号 Go 1.18 正式版发布 了解最新特色以及使用方法

这个人很懒,什么都没留下

文章评论