[解決済み】インターフェースのスライスを変換するタイプ
質問
なぜGoは暗黙のうちに
[]T
を
[]interface{}
を暗黙のうちに変換する場合
T
を
interface{}
. この変換について、私が見逃している何か自明でないことがあるのでしょうか?
例
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build
文句を言う
関数の引数で、(型[]文字列)を型[]インターフェース{}として使用することはできません。
そして、明示的にやってみても同じことです。
b := []interface{}(a)
文句を言う
(型[]文字列)を型[]インターフェース{}に変換することはできません。
だから、この変換をする必要があるたびに(よく出てくるようです)、次のようなことをしてきました。
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
これを行う良い方法、またはこれらの変換を支援する標準ライブラリ関数がありますか? 例えばintやstringのリストを受け取ることができる関数を呼び出すたびに、4行の余分なコードを書くのはちょっと馬鹿馬鹿しい気がするのです。
どのように解決するのですか?
Goでは、複雑でコストのかかる操作を構文で隠してはいけないという一般的なルールがあります。を変換して
string
を
interface{}
はO(1)時間で行われる。を変換するのは
[]string
を
interface{}
も、スライスが1つの値であることに変わりはないので、O(1)の時間で行われます。しかし
[]string
を
[]interface{}
はO(n)時間です。なぜなら、スライスの各要素を
interface{}
.
ただし、文字列の変換は例外である。を変換する場合
string
との間で
[]byte
または
[]rune
Goは、変換が"syntax"であるにもかかわらず、O(n)の仕事をする。
この変換を代行してくれる標準ライブラリ関数はありません。reflectで作ることはできますが、3行のオプションより遅くなるでしょう。
リフレクションを使った例。
func InterfaceSlice(slice interface{}) []interface{} {
s := reflect.ValueOf(slice)
if s.Kind() != reflect.Slice {
panic("InterfaceSlice() given a non-slice type")
}
// Keep the distinction between nil and empty slice input
if s.IsNil() {
return nil
}
ret := make([]interface{}, s.Len())
for i:=0; i<s.Len(); i++ {
ret[i] = s.Index(i).Interface()
}
return ret
}
しかし、あなたの最善の方法は、あなたが質問であげたコードの行を使うことです。
b := make([]interface{}, len(a))
for i := range a {
b[i] = a[i]
}
関連
-
[解決済み] Notepad++ 用の Go 言語プラグイン
-
Solve golang compile prompt dial tcp 172.217.160.113:443: connectex: 接続の試行に失敗しました
-
[解決済み] Golangで定数mapを宣言するには?
-
[解決済み] Goで2つのスライスを連結する
-
[解決済み] Goでオブジェクトの型を見つけるには?
-
[解決済み] 2枚のスライスの等価性を確認する
-
[解決済み】Goのタグはどのような用途に使われますか?
-
[解決済み】Goはサードパーティ・パッケージをどのようにアップデートしますか?
-
[解決済み】アプリケーションの自動ビルドによるバージョン管理
-
[解決済み] 2つの構造体、スライス、またはマップが等しいかどうかを比較する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Go モジュールのローカル リポジトリとして Artifactory を使用する方法
-
[解決済み] Notepad++ 用の Go 言語プラグイン
-
[解決済み] golang の "go get" コマンドで "go: missing Git command" というエラーが表示される。
-
[解決済み] 地図をコピーするには?
-
[解決済み】指定したファイル内のテストケースを実行するには?
-
[解決済み】GoはREPLを提供しますか?
-
[解決済み】アプリケーションの自動ビルドによるバージョン管理
-
[解決済み】Goの構造体にデフォルト値を設定する方法
-
[解決済み】データ(型インターフェース{})を文字列に変換できない:型アサーションが必要
-
[解決済み】gopathを使わずにローカルパッケージをインポートする方法