3 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
不,您將在相同的內(nèi)存上工作。切片是指針,因此切片的默認(rèn)“復(fù)制”意味著復(fù)制地址本身,而不是在該地址找到的值。
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())
}
如您所見(jiàn),每個(gè)元素的所有地址都是相同的,并且當(dāng)您更改一個(gè)變量項(xiàng)的一個(gè)值時(shí),另一個(gè)值也可用。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
Go 不支持在指向不同結(jié)構(gòu)的指針之間進(jìn)行轉(zhuǎn)換。如果您真的想要,您可以使用unsafe
包含特殊類(lèi)型的包,該類(lèi)型unsafe.Pointer
支持其他類(lèi)型無(wú)法執(zhí)行的操作:
任何類(lèi)型的指針值都可以轉(zhuǎn)換為指針。
指針可以轉(zhuǎn)換為任何類(lèi)型的指針值。
uintptr 可以轉(zhuǎn)換為指針。
指針可以轉(zhuǎn)換為 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 關(guān)注
- 370 瀏覽
添加回答
舉報(bào)