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