goにgenricsが来るらしい

弱点なくなるじゃんね。
バックエンドにgoを選択したのは何かのお導きだったのか。

https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md
によると2022年の1.18バージョンで正式リリースされるとのこと。

既存のライブラリを利用したコードでも支障なく動くのかが気になるところであるが、以下によると「デザインはGo1と完全な下位互換性があります。」とあるのできっといけるはず。
https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-contracts.md
https://medium.com/eureka-engineering/golang-generics-design-draft-linked-list-4d1174e2355d
上記ブログの手順をやってみた。

go2goブランチでgoをビルド

mkdir ~/go2go && cd go2go
git clone https://go.googlesource.com/go goroot && cd goroot
git fetch 
git checkout dev.go2go
cd src
./make.bash
echo 'export PATH="$HOME/go2go/goroot/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

動かない 動いた(2021/04/27追記)

go tool go2go run main.go2
cannot find package "run" in any of:
...
/Users/user/go2go/goroot/bin/go [run run main.go] failed: exit status 1

[run run main.go]て何?run main.goが正しいのでは。

2021/04/27追記
run runバグでした。
最新をpullして実行したらgo tool go2go run main.go2で動きましたが、やはりfiber使ったコードではエラーになる。

動いた

バグなのかなってことでtranslateでgoファイルに変換して自分でrunするとうまくいった。
go tool go2go translate main.go2で変換コードを確認してみる。
Genericな関数もちゃんと変換されてる

go tool go2go translate main.go2
go run main.go
package main

import "fmt"

func Print[T any](s []T) {
	for _, v := range s {
		fmt.Println(v)
	}
}

func main() {
	Print([]int{1, 2, 3, 4, 5})
	println("hello")
}
// Code generated by go2go; DO NOT EDIT.


//line main.go2:1
package main

//line main.go2:1
import "fmt"

//line main.go2:11
func main() {
//line main.go2:11
 instantiate୦୦Print୦int([]int{1, 2, 3, 4, 5})
//line main.go2:13
 println("hello")
}
//line main.go2:5
func instantiate୦୦Print୦int(s []int,) {
	for _, v := range s {
		fmt.Println(v)
	}
}

//line main.go2:9
type Importable୦ int

//line main.go2:9
var _ = fmt.Errorf

でもこれだと他のジェネレータ系と変わらないね

作り始めたfiberサーバにそのまま使えるのか

結論だけ言うとうまくいかなかった。
importGo1Packageってとこで死んでるので既存ライブラリのインポートに失敗してるっぽい。
徹夜してprintログ仕込みまくってtagsパラメータを指定したりファイル名から対象OS選択する処理を追加したりすると何とかimportGo1Packageは突破できたけど、次に型チェックで失敗する。
go2goは実験用ブランチみたいだからプレビューバージョンくらいになるまでは大人しくジェネレータ使うことにしよう。