首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切片类型初始化方法初始化失败

切片类型初始化方法初始化失败
EN

Stack Overflow用户
提问于 2012-04-06 00:29:55
回答 1查看 196关注 0票数 2

我尝试为我自己的类型实现一个初始化方法。但是,在调用该方法之后,main()中的变量保持不变。我可能还没有完全理解切片的工作原理,下面是我的示例代码

代码语言:javascript
复制
package main
import "fmt"

type test [][]float64

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

我的印象是接收器类型的内容*是可以改变的,但切片似乎不是这样的。那么如何正确地将我的初始化函数绑定到我的类型?我很确定我这方面有误会...我试过几种方法,比如

代码语言:javascript
复制
var t *test = new(test)

代码语言:javascript
复制
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)...)
    }
}

以此类推,但都失败了。

我目前所知道的唯一有效的解决方案是一个未绑定的方法,它返回指向新切片的指针。现在可以这样做了,但我想把它作为接口的前提条件。那么我如何绑定它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-06 00:51:01

代码语言:javascript
复制
func (p *test) init(m, n int){
    tmp = make(test, m)
    for i := 0; i < m; i++ {
        tmp[i] = make([]float64, n)
    }
    *p = tmp
}

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

代码语言:javascript
复制
func newTest(m, n int) test {
    t = make(test, m)
    for i := range t {
        t[i] = make([]float64, n)
    }
    return t
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10032400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档