我可以省略make的类型吗?

时间:2016-05-26 00:54:21

标签: go

制作切片或地图时......

type myType []map[string]someType

v = make(myType, 1)

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

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

...我总是要指定两次类型。 make可以不推断它吗?

当type是匿名结构时,这将特别有用。

例如在Java中,可以省略对类型的第二次提及:

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

2 个答案:

答案 0 :(得分:5)

不,这是不可能的。 make需要一个类型作为其第一个参数,并且只有两种方式来指定类型:作为名称(例如:myType)或作为类型文字(例如:[]int )。

原则上,您可以使用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)
}

但这对我来说根本不是一个好主意。

答案 1 :(得分:-3)

type myType []map[string]someType你定义了一个切片的地图,它是不同的类型

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)
}

运行完全正常