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)...)
    }
}

などですが、すべて失敗しました。

私が現在知っている唯一の実用的な解決策は、新しいスライスへのポインターを返す非バインドメソッドです。今のところこれで十分ですが、これをインターフェースの前提条件にしたいです。では、どうすればそれをバインドできますか?

4

1 に答える 1

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
}
于 2012-04-05T16:51:00.950 に答える