2023/08/24
Categories:
ハッシュテーブルの実装やろうとしてる。
いろいろ調べてるときにtypes/typeutil
パッケージをみつけた。
ChatGPT曰く
types/typeutil
はGoのgolang.org/x/tools
リポジトリ内にあるパッケージで、型情報のユーティリティ関数やデータ構造を提供しています。このパッケージは、Goのソースコードの静的解析を行う際に役立つツールやライブラリで使用されることが多いです。types/typeutil
パッケージの主なコンポーネントには以下のようなものがあります:
- Map: 型をキーとして使用できるマップを提供します。Goの組み込みのマップでは、インターフェースや関数などの一部の型をキーとして使用することができませんが、
typeutil.Map
を使用すると、これらの型もキーとして使用することができます。- MethodSet: 与えられた型のメソッドセットを効率的に計算します。これは、インターフェースの満足チェックや型のメソッドの探索に役立ちます。
- Visit: 型の構造を再帰的に訪問するためのヘルパー関数を提供します。これは、複雑な型の構造を解析する際に役立ちます。
types/typeutil
パッケージは、Goのソースコードの静的解析やリファクタリングツールの開発に役立つユーティリティを提供しています。このパッケージを直接使用することは少ないかもしれませんが、Goのソースコードの解析や変換を行うツールの開発には非常に役立ちます。
MapはbuiltinのmapとちがってChain法でつくってるっぽい。SetHasherしないとセットされる標準のhasherだと型情報によってハッシュ関数を切り替える作りになっているっぽい。
ただ、builtinのmap
をラップした構造体なのでリサイズとかはmapにお任せ。map
のキーをhasherで計算したハッシュ値を使っていてそのおかげで元のmapで扱えない型でもキーとして使えるようになっている。starlark-go
の内部のhashtableも同じ感じになっているので型ごとに切り替えるやり方を踏襲しよう。