弱点なくなるじゃんね。
バックエンドに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は実験用ブランチみたいだからプレビューバージョンくらいになるまでは大人しくジェネレータ使うことにしよう。