作者: 魚のフライ
最近、Go コアチームの責任者である @Russ Cox (以下、rsc) が、Go プログラミング言語の Go1 互換性強化とその状況を説明する記事「下位互換性、Go 1.21、および Go 2」を書きました。 Go2. と宣伝。
今日は、Go の将来の計画、方向性、rsc の考え方について学ぶ手助けになれば幸いです。
1Go1 の互換性破壊の歴史
新しい構造体フィールドを追加
最初のケースは比較的古典的なものです。Go1 では、このコードは正常に実行できます。次のデモコード:
package main
import "net"
var myAddr = &net.TCPAddr{
net.IPv4(18, 26, 4, 9),
80,
}
ただし、Go1.1 では、このコードは実行できません。次のコードに変更する必要があります。
var myAddr = &net.TCPAddr{
IP: net.IPv4(18, 26, 4, 9),
Port: 80,
}
当時の新しいバージョンでは、net.TCPAddr
新しいゾーンフィールドが に追加されたためです。フィールドを宣言されていない値に対応させる元の方法では、いくつかの問題が発生します。
その後の新しいバージョンの仕様では、標準ライブラリに提出されたコードに対する要件が公式に直接追加され、値を割り当てるときにフィールド名を宣言する必要がありました。これにより、この問題が回避されます。
ソート/圧縮アルゴリズムの実装の改善
2 番目のケースでは、Go 1.6 で公式が Sort のソート実装を変更し、実行速度が約 10% 向上しました。以下は、名前の長さに基づいて色のリストを並べ替え、結果を出力するデモ コードです。
colors := strings.Fields(
`black white red orange yellow green blue indigo violet`)
sort.Sort(ByLen(colors))
fmt.Println(colors)
すべてがとても良く聞こえます。
実際には、並べ替えアルゴリズムを変更すると、通常、等しい要素の並べ替え方法が変わります。その結果、Go1.5 と Go1.6 の出力結果は矛盾します。
Go 1.5: [red blue green white black yellow orange indigo violet]
Go 1.6: [red blue white green black orange yellow indigo violet]
順番に並べ替えると、結果セットの違いは次のようになります。
-
Go1.5 は緑、白、黒を返します。
-
Go1.6 は白、緑、黒を返します。
プログラムが結果セットの出力順序に依存している場合、これは重大な互換性違反になります。
3 番目のケースは Go 1.8 のケースと似ており、公式は圧縮/フラット アルゴリズムを改善し、CPU やメモリに明らかな変更を加えることなく、圧縮後の結果セットを小さくしました。素晴らしい結果のようですね。
しかし実際には、Google には再現可能なアーカイブの構築を必要とし、元のアルゴリズムに依存する社内プロジェクトがあったため、内部でひっくり返りました。最後に、それを解決するためにコピーをフォークしました。
2Go1.21 以降の拡張互換性 (GODEBUG)
互換性が壊れた上記の例から判断すると、Go 関係者が意図的に互換性を壊したわけではないことがわかります。ただし、修正する必要があるさまざまな理由と考慮事項があります。
このため、Go1.21からはGODEBUGの仕組みが正式にエクスポートされることになり、これは公式の「バックドア」を開くことに相当します。破壊的な変更を加えた後のドアノブと考えてください。
GODEBUG の設定で新機能のオンとオフを切り替えられるようにします。たとえば、次のオプションがあります。
-
GODEBUG=asyncpreemptoff=1
: シグナルベースの Goroutine プリエンプションを無効にします。これにより、オペレーティング システムのバグが検出されることがあります。 -
GODEBUG=cgocheck=0
: ランタイム CGO ポインタ チェックを無効にします。 -
GODEBUG=cpu.<extension>=off
: 実行時に特定の CPU 拡張機能の使用を無効にします。
対応する GODEBUG も go.mod 内の Go バージョン番号に従って設定され、バージョンによって合意された Go1 互換性保証戦略を提供します。
興味のある方は「努力を強化せよ!」をチェックしてみてください。Go は Go1 [1] の下位互換性を強化し、互換性を強化するための完全な仕様が存在します。
3Go2の状況と計画
Go 公式 (@rsc 経由) は、以前に抽出されたパイ、つまり、いつ Go2 仕様のリリースが見られ、Go1 プログラムが中断されるのか、という問題に正式に答えました。
答えは決してありません。過去と決別し、古いプログラムをコンパイルしなくなるという意味で、Go 2 は決して実現しません。Go が 2017 年に Go 1 の大幅な改訂を開始したという意味では、Go 2 はすでに起こっています。
つまり、明らかになった意味は、強いて言うなら、Go2 はすでに Go1 をリストしているということです。
将来の計画に関しては、Go1 プログラムを破壊する Go2 は存在しません。作業の方向性は、互換性を確保するための努力を倍加して新しい作業を実行することです。
4 まとめ
一般に、rsc は長期的な計画を立て直し、Go1 との互換性を破る計画を立て、GODEBUG、go.mod のバージョン制限などの多くの手段をリリースしました。
これは、Go2 が直接バックドアできる方向につながり、Go1 の互換性保証の標準的な約束をよりよく満たすことができます。この点だけをとっても、とても考え抜かれた内容です。
生徒の中には、今のGoがこんな感じなら、次は変わるかも知れないと言う人もいるかもしれません。これは難しいかもしれません。実際、rsc 氏はチームの責任者になってまだ数年しか経っていません。彼の職務経歴書によれば、彼と他の主要幹部数名はすでに Google で長年の勤務経験を持っています。
しばらくは変わらないと思います。
変更したい場合は、Go コア チームが変更されるまで待たなければなりません。また、コミュニティには多くの人が住んでおり、一般的に規制に対してより注意を払うため、多くの抵抗もあるでしょう。
記事は継続的に更新されています。WeChat で [Brain is in the Frying Fish] を検索して読むことができます。この記事はGitHub github.com/eddycjy/blo…[2]に含まれています。Go 言語を学習するには、地図とルートを学習してください[3]。スターは最新情報をお知らせするために歓迎します。
囲碁本シリーズ
-
Go 言語入門シリーズ: Go プロジェクトの実践の予備調査[4]
-
Go 言語プログラミングの旅: プロジェクトでの Go の徹底的な使用[5]
-
Go 言語の設計哲学: Go の理由と設計思考を理解する[6]
-
Go 言語の上級者向けの旅: Go ソース コードをさらに詳しく学ぶ[7]
推奨読書
-
新しい機能もあります!Go には、新しいテンプレートを生成するための gonew ツールチェーンが搭載されます[8]
-
Go1.21: セマンティック変更用の汎用ライブラリ、統合ログ/スログ、WASI、その他の新機能についてどれくらい知っていますか? [9]
-
大手インターネット企業における人員削減の理由と兆候[10]
参考文献
[1]
https://mp.weixin.qq.com/s/OIqgqjXEvVmDUmnRqq4PGw: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FOIqgqjXEvVmDUmnRqq4PGw
[2]
https://github.com/eddycjy/blog: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Feddycjy%2Fblog
[3]
https://github.com/eddycjy/go-developer-roadmap: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Feddycjy%2Fgo-developer-roadmap
[4]
https://eddycjy.com/go-categories/: https://link.juejin.cn/?target=https%3A%2F%2Feddycjy.com%2Fgo-categories%2F
[5]
https://golang2.eddycjy.com/: https://link.juejin.cn/?target=https%3A%2F%2Fgolang2.eddycjy.com%2F
[6]
https://golang3.eddycjy.com/: https://link.juejin.cn/?target=https%3A%2F%2Fgolang3.eddycjy.com%2F
[7]
https://golang1.eddycjy.com/: https://link.juejin.cn/?target=https%3A%2F%2Fgolang1.eddycjy.com%2F
[8]
https://mp.weixin.qq.com/s/jk7k5v9uvaNy_2fUsDjq0Q: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2Fjk7k5v9uvaNy_2fUsDjq0Q
[9]
https://mp.weixin.qq.com/s/Nuj_cYFvBesaBbSSz5PuBg: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FNuj_cYFvBesaBbSSz5PuBg
[10]
https://mp.weixin.qq.com/s/vjbiRS4dpRrk7-wqXZ-Yw: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FvjbiRS4dpRrk7 -wqXZ-Yw