我尝试为我自己的类型实现一个初始化方法.但是在调用方法之后,变量在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)
}
Run Code Online (Sandbox Code Playgroud)
我的印象是接收器类型*的内容可以改变,但这似乎不是切片的情况.那么如何将我的初始化函数正确绑定到我的类型呢?我很确定在我身边存在误解......我尝试了几件事
var t *test = new(test)
Run Code Online (Sandbox Code Playgroud)
要么
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)...)
}
}
Run Code Online (Sandbox Code Playgroud)
等等但都失败了......
我目前知道的唯一工作解决方案是一个未绑定的方法,它将指针返回到一个新的切片.这将暂时实现,但我想将其作为界面的先决条件.那我怎么绑它呢?
func (p *test) init(m, n int){
tmp = make(test, m)
for i := 0; i < m; i++ {
tmp[i] = make([]float64, n)
}
*p = tmp
}
Run Code Online (Sandbox Code Playgroud)
你很亲密 以上就是你想要的.但是没有理由避免返回一个新切片的函数.这是惯用的,感觉就像在其他语言中编写构造函数一样:
func newTest(m, n int) test {
t = make(test, m)
for i := range t {
t[i] = make([]float64, n)
}
return t
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |