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) への変換は機能します
回避策
したがって、スライス ヘッダーを文字列ヘッダーとして再解釈する際、その方法は完全にクレイジーであり、適切に動作することは保証できません。ただし、これは問題の
間接的な原因にすぎません。bufio/Reader.ReadLine() の戻り値へのポインタを保持していることですが、そのメソッドのドキュメントには「返されたバッファは、次に ReadLine を呼び出すまでのみ有効です」と書かれています。これは、読者が後でその記憶を自由に再利用できることを意味し、それが実際に起こっていることです。 変換を正しい方法で実行すると (
string(ip))、Go はバッファーの内容を、将来も有効な新しく作成された文字列にコピーします。ただし、文字列にスライスの語呂合わせを入力すると、まったく同じポインターが保持され、リーダーがバッファーを補充すると機能しなくなります。
string() を使用する必要があります。
以上が*(*string)(unsafe.Pointer(&b)) が bufio.Reader で機能しない理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。