[解決済み] Goでio.Readerから文字列へ
2022-04-25 10:11:14
質問
私は
io.ReadCloser
オブジェクトを作成します。
http.Response
オブジェクト)を作成します。
最も効率的な方法は、ストリーム全体を
string
オブジェクトを作成できますか?
解決方法は?
EDITです。
1.10以降、strings.Builderが存在します。例
buf := new(strings.Builder)
n, err := io.Copy(buf, r)
// check errors
fmt.Println(buf.String())
以下、古い情報
文字列に変換するためには、バイト配列を完全にコピーする必要があるため、効率が悪いということです。以下は、あなたが望むことを行うための適切な(非効率的な)方法です。
buf := new(bytes.Buffer)
buf.ReadFrom(yourReader)
s := buf.String() // Does a complete copy of the bytes in the buffer.
このコピーは、保護機構として行われる。文字列は不変である。もし[]byteを文字列に変換することができれば、文字列の中身を変更することができます。しかし、goではunsafeパッケージを使って型安全機構を無効化することができます。unsafeパッケージの使用は自己責任でお願いします。名前だけで十分な警告になることを祈ります。以下は、私がunsafeを使用して行う方法です。
buf := new(bytes.Buffer)
buf.ReadFrom(yourReader)
b := buf.Bytes()
s := *(*string)(unsafe.Pointer(&b))
これで、バイト配列を効率よく文字列に変換することができました。実際には、型システムを騙して文字列と呼ばせているだけなのですが。この方法には2つほど注意点があります。
- すべてのgoコンパイラで動作する保証はありません。plan-9 gc コンパイラで動作しますが、公式仕様に記載されていない "実装の詳細" に依存しています。これがすべてのアーキテクチャで動作し、gcで変更されないことを保証することもできません。つまり、これは悪いアイデアなのです。
- その文字列は変更可能です! そのバッファに対して何らかの呼び出しを行った場合、それは は は文字列を変更します。十分注意してください。
私のアドバイスは、正式な方法にこだわることです。コピーをすることは その 高価であり、unsafeの弊害に見合うものではありません。もし文字列が大きすぎてコピーができないなら、文字列にするべきではないでしょう。
関連
-
[解決済み] Golang 構造体へのキャストインターフェイス
-
[解決済み] Goでマップにキーが含まれているかどうかを確認するには?
-
[解決済み] goで文字列の連結を効率的に行う方法
-
[解決済み] Goでenumを表現する慣用的な方法は何ですか?
-
[解決済み] ゼロ終端のバイト配列を文字列に変換するにはどうすればよいですか?
-
[解決済み] Goでオブジェクトの型を見つけるには?
-
[解決済み] Goの文字列を印刷せずにフォーマットしますか?
-
[解決済み] Goで文字列を整数型に変換する?
-
[解決済み】関数宣言の構文:関数名の前に括弧でくくられたもの
-
[解決済み] Goで現在の時刻をフォーマットされた文字列として取得する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Cgo: すみません、未実装です: 64ビットモードはコンパイルされていません。
-
[解決済み] GolangパッケージがGOROOTにない(/usr/local/go/src/packageName) [閉じた]。
-
Windowsのプロパティダイアログボックスのエンコーディングの問題 ファイル名、ディレクトリ名、ボリュームラベルの構文が正しくありません。
-
[解決済み] キューの実装はありますか?
-
[解決済み] Goのペア/タプルデータ型
-
[解決済み] goインストールとは何ですか?
-
[解決済み] go getコマンドとgo mod downloadコマンドの違いは何ですか?
-
[解決済み] gofmtの使い方を教えてください。
-
[解決済み] パッケージ <package_name> を提供するモジュールの go.sum のエントリがありません。
-
[解決済み】チャンネルを開いたままにしておいてもいいのでしょうか?