3 回答
TA贡献1862条经验 获得超7个赞
不,您将在相同的内存上工作。切片是指针,因此切片的默认“复制”意味着复制地址本身,而不是在该地址找到的值。
http://play.golang.org/p/vy-c7sS9Fz
package main
import (
"fmt"
)
type MyIntsArray []int
func (a MyIntsArray) Sum() int {
sum := 0
for _, i := range a {
sum += i
}
return sum
}
func main() {
myInts := []int{1,2,3,5,7,11}
myIntsArr := MyIntsArray(myInts)
fmt.Printf("myInts: %v, %p, myIntsArr: %v, %p, Sum: %v\n", myInts, myInts, myIntsArr, myIntsArr, myIntsArr.Sum())
for i, _ := range myInts {
fmt.Printf("myInt: %v, %p, myIntsArr elem: %v, %p\n", myInts[i], &myInts[i], myIntsArr[i], &myIntsArr[i])
}
myInts[0] = 100
fmt.Printf("myInts: %v, %p, myIntsArr: %v, %p, Sum: %v\n", myInts, myInts, myIntsArr, myIntsArr, myIntsArr.Sum())
myIntsArr[1] = 200
fmt.Printf("myInts: %v, %p, myIntsArr: %v, %p, Sum: %v\n", myInts, myInts, myIntsArr, myIntsArr, myIntsArr.Sum())
}
如您所见,每个元素的所有地址都是相同的,并且当您更改一个变量项的一个值时,另一个值也可用。
TA贡献1777条经验 获得超3个赞
Go 不支持在指向不同结构的指针之间进行转换。如果您真的想要,您可以使用unsafe
包含特殊类型的包,该类型unsafe.Pointer
支持其他类型无法执行的操作:
任何类型的指针值都可以转换为指针。
指针可以转换为任何类型的指针值。
uintptr 可以转换为指针。
指针可以转换为 uintptr。
http://play.golang.org/p/fhOptEOQ74
package main
import (
"fmt"
"unsafe"
)
type MyType1 struct {
Val int
Values []int32
}
type MyType2 struct {
Val int
Values []float32
}
func main() {
t1 := &MyType1{Val: -1, Values: []int32{1,3,5}}
p := unsafe.Pointer(t1)
var t2 *MyType2 = (*MyType2)(p)
fmt.Printf("t1: %v, t2: %v\n", t1, t2)
t1.Val = -10
t1.Values[1] = 200
fmt.Printf("t1: %v, t2: %v\n", t1, t2)
t2.Val = -20
t2.Values[1] = 1.2345
fmt.Printf("t1: %v, t2: %v\n", t1, t2)
}
代码将打印:
t1: &{-1 [1 3 5]}, t2: &{-1 [1e-45 4e-45 7e-45]}
t1: &{-10 [1 200 5]}, t2: &{-10 [1e-45 2.8e-43 7e-45]}
t1: &{-20 [1 1067320345 5]}, t2: &{-20 [1e-45 1.2345 7e-45]}
- 3 回答
- 0 关注
- 323 浏览
添加回答
举报