このGo Data Structuresの記事によると、Stringsセクションの下に、文字列のスライスを取得すると元の文字列がメモリに保持されると記載されています。
「(余談ですが、Java やその他の言語には、文字列をスライスして小さな断片を保存するときに、元の文字列への参照によって元の文字列全体がメモリ内に保持されるというよく知られた落とし穴があります。 Go にもこの落とし穴があります。私たちが試みて却下した別の方法は、文字列のスライス (割り当てとコピー) を非常に高価にすることであり、ほとんどのプログラムはそれを避けています。)"
したがって、非常に長い文字列がある場合:
s := "Some very long string..."
そして、小さなスライスを取ります:
newS := s[5:9]
s
もリリースするまで、オリジナルはリリースされませんnewS
。newS
これを考慮して、長期間保持する必要があるがs
、ガベージコレクションのためにリリースする必要がある場合、どのような適切なアプローチをとるべきでしょうか?
たぶんこれだと思いました:
newS := string([]byte(s[5:9]))
しかし、それが実際に機能するかどうか、またはより良い方法があるかどうかはわかりませんでした.