2012-04-05 274 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

相關問題