我尝试为我自己的类型实现一个初始化方法。但是,在调用该方法之后,main()中的变量保持不变。我可能还没有完全理解切片的工作原理,下面是我的示例代码
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)
}我的印象是接收器类型的内容*是可以改变的,但切片似乎不是这样的。那么如何正确地将我的初始化函数绑定到我的类型?我很确定我这方面有误会...我试过几种方法,比如
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)...)
}
}以此类推,但都失败了。
我目前所知道的唯一有效的解决方案是一个未绑定的方法,它返回指向新切片的指针。现在可以这样做了,但我想把它作为接口的前提条件。那么我如何绑定它呢?
发布于 2012-04-06 00:51:01
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
}https://stackoverflow.com/questions/10032400
复制相似问题