2012-04-05 223 views
2

我尝试为我自己的类型实现初始化方法。然而,在调用该方法后,该变量在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)...) 
    } 
} 

等但都失败了..

的我目前知道的唯一工作解决方案是一个未绑定的方法,该方法将指针返回到新切片。这会做现在,但我想使这个接口的先决条件。那我该如何绑定它?

+0

分配一件事'tmp',然后在下一行指派另一件事是愚蠢的;它只是丢弃第一个值 – newacct 2012-04-06 00:08:35

+0

请在界面中说明您的最后一点。什么接口? – alphazero 2012-04-06 03:29:47

回答

8
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 
} 
+0

啊thx ...我知道我很接近... – Bort 2012-04-08 10:29:31

相关问题