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
的更新