2016-05-26 8 views
1

スライスやマップを作る... makeのタイプを省略することはできますか?

https://play.golang.org/p/Af9b0n0ykT

type myType []map[string]someType 

v = make(myType, 1) 

v[0] = make(map[string]someType) 

...私はいつも二度タイプを指定する必要があります。 makeはそれを推論できませんか?

これは、型が匿名の構造体の場合に特に役立ちます。

例えば、Javaでのタイプの第二の言及は省略することができます:type myType []map[string]someType

HashMap<String, SomeType> v = new HashMap<>(); 
+1

いいえ、匿名の構造体には使用できません。構造体に名前を付けるのはなぜですか? –

+0

私はそれに名前をつけても、私はまだそれを2度綴る必要があります。また、すべてのレベルが意味のある名前を持つわけではないような構造では、 'somewhatComplexTypeCMapEntryType'のような型名につながります。 – AndreKR

+0

しかし、あなたは正しいです、私の質問は実際に複雑な構造体についてではありません、私はそれを編集します。 – AndreKR

答えて

5

いいえ、不可能です。 makeには、最初の引数として型が必要です。型を指定するには、名前(例:myType)または型リテラル(例:[]int)の2通りしかありません。原則として

、あなたはreflectを使用してこの問題を回避することができます

package main 

import (
    "fmt" 
    "reflect" 
) 

type someType struct{} 

type myType []map[string]someType 

func main() { 
    var v = make(myType, 1) 
    reflect.ValueOf(v).Index(0).Set(reflect.MakeMap(reflect.TypeOf(v).Elem())) 
    fmt.Println(v) 
} 

しかし、これは私には全く良いアイデアのようには見えません。

+0

実際には: 'blah = reflect.MakeMap(reflect.TypeOf(blah))。Interface()' - > ' reflect.MakeMap(reflect.TypeOf(blah))を使用することはできません。type map [type] int(type interface {})as assignment:型アサーションが必要です。 ' – AndreKR

+0

'これを行うには 'reflect'を使うことができます。それは良い考えではありません。 (私は私の答えを編集した)。 –

+0

Hm、それを関数にラップすることは可能でしょうか?これまで運がなかった:https://play.golang.org/p/-j7g68V7g0 – AndreKR

-3

を使用すると、マップのスライスを定義し、それが

https://play.golang.org/p/rElNLx0H0S

package main 

type someType int 
type mymap map[string]someType 
type myType []mymap 

func main() { 
    v := make(myType, 1) 
    v[0] = make(mymap) 

    // HashMap<String, SomeType> v = new HashMap<>(); 
    var _ mymap = make(mymap) 
} 
異なるタイプです

は完全に正常に実行されます

+0

これは質問に対する回答ですか?私のコード例を(型に与えられた別の名前で)繰り返すだけです。 – AndreKR

+0

'make(mymap)'は 'new HashMap <>()'と全く同じように見えます。どうしたの? – Darigaaz

+0

とbtwあなたのJavaの例でスライス/配列/リストはありませんので、はい、それは質問の答えです – Darigaaz

関連する問題