登录
首页 >  Golang >  Go问答

使用功能设置而非方法

来源:stackoverflow

时间:2024-02-24 21:42:24 135浏览 收藏

golang学习网今天将给大家带来《使用功能设置而非方法》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

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

package main

import "fmt"

type t interface {
}

type hashmap struct {
    m    map[t]t
    k    []t
}

func (h *hashmap) from(m map[t]t) {
    h.m = m
    h.k = make([]t, len(m))
    i := 0
    for key := range m {
        h.k[i] = key
        i++
    }
}

func main() {
    inv := new(hashmap)
    inv.from(map[t]t{"first": 1})
    fmt.printf("%v", inv)
}

输出如预期正确:

&{map[first:1] [first]}

我正在寻找一种可以写作的方式:

inv := new(hashmap).from(map[t]t{"first": 1})
// instead of:
//  inv := new(hashmap)
//  inv.from(map[t]t{"first": 1})

所以,我重写了代码如下:

package main

import "fmt"

type t interface {
}

type hashmap struct {
    m    map[t]t
    k    []t
    from func(m map[t]t) hashmap    // <---- new
} 

func from(m map[t]t) hashmap {        // <----- change of func signature
    h := new(hashmap)
    h.m = m
    h.k = make([]t, len(m))
    i := 0
    for key := range m {
        h.k[i] = key
        i++
    }
    return *h
}

func main() {
    inv := new(hashmap).from(map[t]t{"first": 1})
    fmt.printf("%v", inv)
}

但是我得到了以下输出:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x49c2c2]

goroutine 1 [running]:
main.main()
    d:/goplay/hashmap.go:55 +0xf2
exit status 2

知道如何按照我想要的方式完成它吗?


解决方案


您已经非常接近获得它了!首先,由于您已经在 main() 中创建了 hashmap,因此无需在 from() 中再次创建。只需删除第 14 行并更改 from() 的签名,如下所示:

func (h *hashmap) from(m map[t]t) hashmap {

同时删除第 11 行 - 在 go 中,您不需要声明类型的方法,只需定义它即可。

Try it in the playground

使用追加构建切片也是惯用的:

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
}

今天关于《使用功能设置而非方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>