为了账号安全,请及时绑定邮箱和手机立即绑定

切片类型的初始化方法无法初始化

切片类型的初始化方法无法初始化

Go
呼啦一阵风 2021-04-26 17:48:26
我尝试为我自己的类型实现初始化方法。但是,调用该方法后,变量在main()中保持不变。我可能还没有完全了解切片的工作原理,这是我的示例代码package mainimport "fmt"type test [][]float64func (p *test) init(m, n int){    tmp := *p    tmp = make(test, m)    for i := 0; i < m; i++ {        tmp[i] = make([]float64, n)    }}func main(){    var t test    t.init(10,2)    fmt.Println(t)}我的印象是可以更改接收器类型*的内容,但对于片来说似乎并非如此。那么,如何正确地将初始化函数绑定到我的类型上呢?我很确定我的身边存在误会....我尝试了几件事,例如var t *test = new(test)或者func (p *test) init(m, n int){    tmp := *p    tmp = append(tmp, make(test, m)...)    for i := 0; i < m; i++ {        tmp[i] = append(tmp[i], make([]float64, n)...)    }}等等,但是都失败了。我目前知道的唯一可行的解决方案是一个未绑定的方法,该方法将指针返回到新的切片。现在就可以了,但是我想使它成为接口的先决条件。那么我该如何绑定呢?
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

func (p *test) init(m, n int){

    tmp = make(test, m)

    for i := 0; i < m; i++ {

        tmp[i] = make([]float64, n)

    }

    *p = tmp

}

你近了。以上就是你想要的。但是没有理由避免使用返回新切片的函数。这很惯用,感觉很像用其他语言编写构造函数:


func newTest(m, n int) test {

    t = make(test, m)

    for i := range t {

        t[i] = make([]float64, n)

    }

    return t

}


查看完整回答
反对 回复 2021-05-10
  • 1 回答
  • 0 关注
  • 251 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信