任意のスライスをインターフェイススライスにキャストする

みなさんこんにちは。 Goに精通しているすべての人に質問がありましたが、私がこのようにできなかったことは何ですか。







var a = []int{1,2,3} b = []interface(a)
      
      





このように書かなければならない理由:







 b := make([]interface{}, len(a)) for i:=0; i<len(a); i++ { b[i] = a[i] }
      
      





しかし、それは別の方法で可能です....







私は少しウォームアップし、それをより速く、より便利にする方法を見つけることにしました。 わかった。







詳細はこちら







つまり、安全でないパッケージのおかげで、元のスライスのlenとcapでインターフェイススライスを作成し、ポインターをコピーすることで、インターフェイススライスの作成とデータのコピーを置き換えることができました。 インターフェイスの実装機能のおかげで、無料の(ただし本格的な)COW(コピーオンライト)メカニズムが得られました。最終スライスのデータを変更するまで、元のスライスと結果のスライスのデータは1か所にありますが、結果の要素を変更するとこの要素をスライスすると、ソースをポイントしなくなります。 逆の順序では、残念ながら、これは機能しません。







パフォーマンスについて少し:







ソリューションの有効性は、スライス要素のサイズとスライスの長さに直接依存します;スライスが長いほど、また要素の「重量」は、より効率的です







https://gist.github.com/t0pep0/af41fba259eb4d3d00d2e7efa0e4093a








All Articles