*(*string)(unsafe.Pointer(&b)) が bufio.Reader で機能しない理由

王林
リリース: 2024-02-09 19:54:17
転載
988 人が閲覧しました

为什么 *(*string)(unsafe.Pointer(&b)) 不适用于 bufio.Reader

Go 言語では、データ型を変換するために型変換をよく使用します。たとえば、[]byte 型のスライスを string 型の文字列に変換します。通常、`string()` 関数を使用して型変換を実行できますが、特殊なケースでは、このメソッドが問題を引き起こす可能性があります。 Go 言語では、`(string)(unsafe.Pointer(&b))` メソッドは「マジック ポインタ」メソッドと呼ばれ、[]byte 型のスライスを string 型の string に変換するために使用されます。ただし、このメソッドは bufio.Reader タイプでは機能しません。なぜ?この質問に答えてみましょう。

質問内容

ファイルがあります。いくつかのip

を持っています リーリー

このファイルをスライス用に読み取り、*(*string)(unsafe.pointer(&b)) を使用して [] バイトを文字列に解析しましたが、機能しません

リーリー ###結果:### リーリー

1.1.1.0/24 が 2.2.2.0/24 に変更されたのはなぜですか?

###変化### リーリー

から string(ip) への変換は機能します

回避策

したがって、スライス ヘッダーを文字列ヘッダーとして再解釈する際、その方法は完全にクレイジーであり、適切に動作することは保証できません。ただし、これは問題の

間接的な原因にすぎません。

p>

本当の問題は、

bufio/Reader.ReadLine() の戻り値へのポインタを保持していることですが、そのメソッドのドキュメントには「返されたバッファは、次に ReadLine を呼び出すまでのみ有効です」と書かれています。これは、読者が後でその記憶を自由に再利用できることを意味し、それが実際に起こっていることです。 変換を正しい方法で実行すると (

string(ip))、Go はバッファーの内容を、将来も有効な新しく作成された文字列にコピーします。ただし、文字列にスライスの語呂合わせを入力すると、まったく同じポインターが保持され、リーダーがバッファーを補充すると機能しなくなります。

コピーや割り当てを回避するために、パフォーマンス ハックとしてポインター トリックを使用することに決めた場合、それは残念です。リーダー インターフェイスではデータのコピーが強制されるため、

string() を使用する必要があります。

以上が*(*string)(unsafe.Pointer(&b)) が bufio.Reader で機能しない理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!