[解決済み】データ(型インターフェース{})を文字列に変換できない:型アサーションが必要
2022-04-11 17:18:06
質問
私は囲碁の初心者ですが、このように遊んでいました。 通知 パッケージを使用します。
最初はこんな感じのコードでした。
func doit(w http.ResponseWriter, r *http.Request) {
notify.Post("my_event", "Hello World!")
fmt.Fprint(w, "+OK")
}
に改行を追加したかったのです。
Hello World!
という関数ではありません。
doit
というのも、これはとてもつまらないことですが、上記の
handler
の後に、以下のような感じです。
func handler(w http.ResponseWriter, r *http.Request) {
myEventChan := make(chan interface{})
notify.Start("my_event", myEventChan)
data := <-myEventChan
fmt.Fprint(w, data + "\n")
}
後
go run
:
$ go run lp.go
# command-line-arguments
./lp.go:15: invalid operation: data + "\n" (mismatched types interface {} and string)
ちょっとググってみたら SOでこの質問 .
そして、コードを更新しました。
func handler(w http.ResponseWriter, r *http.Request) {
myEventChan := make(chan interface{})
notify.Start("my_event", myEventChan)
data := <-myEventChan
s:= data.(string) + "\n"
fmt.Fprint(w, s)
}
こんな感じでいいんでしょうか?コンパイラのエラーはなくなったので、かなりいいんじゃないでしょうか?これって効率的なの?もっと違うやり方がいいのか?
どのように解決するのですか?
によると 囲碁の仕様 :
インターフェース型の式xと型Tに対して、一次式x.(T)はxがnilでないこと、xに格納された値が型Tであることを保証する。
型アサーションは、あるインターフェースの値がある具象型を含むこと、またはその具象型が他のインターフェースを満たすことを宣言することができます。
この例では、データ(型interface{})が具象型stringを持つことを表明していますね。もし、間違っていたら、プログラムは実行時にパニックになります。チェックは2つのポインタの値を比較するだけなので、効率を気にする必要はない。
もし、文字列かどうかわからない場合は、two return構文を使ってテストすることができました。
str, ok := data.(string)
dataが文字列でない場合、okはfalseになります。そこで、このような文は、次のようにif文でくくるのが一般的である。
if str, ok := data.(string); ok {
/* act on str */
} else {
/* not string */
}
関連
-
[解決済み] Cgo: すみません、未実装です: 64ビットモードはコンパイルされていません。
-
[解決済み] GoのHTTP基本認証
-
[解決済み] GOBINが設定されていない:go installを実行できない
-
[解決済み] Goで部分文字列を抽出する
-
[解決済み] Goでint値をstringに変換する方法は?
-
[解決済み] ゼロ終端のバイト配列を文字列に変換するにはどうすればよいですか?
-
[解決済み] Goで文字列を整数型に変換する?
-
eclipse+goclipseプラグイン+gdbによるgo言語開発デバッグ環境の構築 ---最終起動シーケンスでのエラー MIコマンドの実行に失敗しました。
-
[解決済み】インターフェースのスライスを変換するタイプ
-
[解決済み] interface{}を文字列に変換するには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】vsコードの解決方法 - goplsコマンドが使用できません。
-
[解決済み] Go: パニック: ランタイム エラー: 無効なメモリ アドレスまたは nil ポインタのデリファレンス
-
[解決済み] GolangパッケージがGOROOTにない(/usr/local/go/src/packageName) [閉じた]。
-
GOROOT に xxx というパッケージがないというエラーが GoLand から報告される
-
[解決済み] go mod vendor` コマンドの目的は何ですか?
-
[解決済み] gofmtの使い方を教えてください。
-
[解決済み] "宣言されているが使用されていない "という迷惑なエラーを回避する方法
-
eclipse+goclipseプラグイン+gdbによるgo言語開発デバッグ環境の構築 ---最終起動シーケンスでのエラー MIコマンドの実行に失敗しました。
-
[解決済み】gopathを使わずにローカルパッケージをインポートする方法
-
[解決済み] interface{}を文字列に変換するには?