gpt4 book ai didi

go - 方法在结构副本上的应用反射(reflect)在原始结构中

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:15 25 4
gpt4 key购买 nike

<分区>

我一直在通过构建一个小型线性代数库来尝试使用 Go 中的方法,但是我遇到了以下代码段的问题:

package main

import (
"fmt"
)

type Matrix struct {
mat []float64
nR, nC int
}

func (m Matrix) String() string { ... }

// EmptyMatrix initializes a nR*nC matrix to 0
func EmptyMatrix(nR, nC int) Matrix { ... }

// BuildMatrix creates a matrix build by its rows, and returns a Matrix
func BuildMatrix(rows ...[]float64) Matrix { ... }

// Set sets the value of mat[i,j] to val
func (m *Matrix) Set(i, j int, val float64) {
if (i < m.nR) && (j < m.nC) {
m.mat[i*m.nC+j] = val
} else {
panic(fmt.Sprintf("Index (%d,%d) out of range (0:%d,0:%d)",
i, j, m.nR, m.nC))
}
}

func main() {
matA := matrix.BuildMatrix([]float64{2, 3}, []float64{4, -5})
matB := matA
fmt.Println(matA)
matB.Set(1,1,2)
fmt.Println(matA)
fmt.Printf("%p\n%p\n",&matA,&matB)
}

运行时,这是输出:

[ [ 2.00 3.00 ]
[ 4.00 -5.00 ] ]
[ [ 2.00 3.00 ]
[ 4.00 2.00 ] ]
0xc04207c060
0xc04207c090

如果我更改 matB 中的值,更改会反射(reflect)在 matA 中,这不是我想要的。在 Python 中,我会从 matA 的深拷贝开始,但我还没有找到 Python 的 copy.deepcopy() 函数的任何标准 Go 实现。我该如何解决?

经过测试的解决方案:

  1. Matrix.mat 确实是一个 slice ,我应该用 copy(matB.mat, matA.mat) 进行复制。但是,这不是唯一的问题,因为它仍在做同样的事情。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com