Go 使用函数选项而不是方法

Go 使用函数选项而不是方法,go,Go,我尝试了以下方法,效果很好: 主程序包 输入“fmt” T型接口{ } 类型hashMap结构{ m映射[T]T k[]T } func(h*hashMap)From(m map[T]T){ h、 m=m h、 k=制造([]T,长度(m)) i:=0 对于键:=范围m{ h、 k[i]=键 我++ } } func main(){ inv:=新建(哈希映射) inv.From(map[T]T{“first”:1}) 格式打印F(“%v”,存货) } 输出如预期的那样正确: &{map[fir

我尝试了以下方法,效果很好:

主程序包
输入“fmt”
T型接口{
}
类型hashMap结构{
m映射[T]T
k[]T
}
func(h*hashMap)From(m map[T]T){
h、 m=m
h、 k=制造([]T,长度(m))
i:=0
对于键:=范围m{
h、 k[i]=键
我++
}
}
func main(){
inv:=新建(哈希映射)
inv.From(map[T]T{“first”:1})
格式打印F(“%v”,存货)
}
输出如预期的那样正确:

&{map[first:1][first]}
我正在寻找一种写作的方式:

inv:=new(hashMap).from(map[T]T{“first”:1})
//而不是:
//inv:=新建(哈希映射)
//inv.From(map[T]T{“first”:1})
因此,我重新编写了以下代码:

主程序包
输入“fmt”
T型接口{
}
类型hashMap结构{
m映射[T]T
k[]T

从func(m map[T]T)hashMap//中,您很快就能得到它!首先,由于您已经在
main()
中创建了hashMap,因此无需在
from()
中再次创建。只需删除第14行并更改
from()的签名,如下所示:

func (h *hashMap) from(m map[T]T) hashMap {
同时删除第11行-在Go中,您不需要声明类型的方法,只需定义它即可

另外,使用append构建切片也是惯用的方法:

func (h *hashMap) from(m map[T]T) hashMap {
    h.m = m
    h.k = make([]T, 0, len(m))
    for key := range m {
        h.k = append(h.k, key)
    }
    return *h
}

hashMap.from
为零(默认值)。您拥有的
from
函数不是
hashMap
上的方法。您需要重新更改函数签名,或者将有效的func分配给
hashMap
的单个实例。非常感谢您的回答和关于
append
的更新