[英]GoLang: Memory allocation for type inheritance and casting in Go
在Go中,如果我有一个继承自自定义类型的自定义类型,如果我将整数数组转换为自定义类型,那会涉及新的内存分配吗?
http://play.golang.org/p/cNpKELZ3X- :
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.Println(fmt.Sprintf("myInts: %v, myIntsArr: %v, Sum: %v", myInts, myIntsArr, myIntsArr.Sum()))
}
更新 :确定,对于片来说,没有内存分配,因为片是指针。
但是我还有一个更普遍的问题。 结构怎么样? 似乎是在复制: http : //play.golang.org/p/NXgM8Cr-qj ,这是因为要使用值类型。
我试图弄清楚是否可以将结构的指针转换为其他类型的指针。 像这样的东西: http : //play.golang.org/p/BV086ZAeGf
package main
import (
"fmt"
)
type MyType1 struct {
Val int
Values []int
}
type MyType2 MyType1
func main() {
t1 := &MyType1{Val: -1, Values: []int{1,3,5}}
var t2 *MyType2
t2 = *MyType2(t1)
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)
}
prog.go:17: cannot convert t1 (type *MyType1) to type MyType2
prog.go:17: invalid indirect of MyType2(t1) (type MyType2)
不会。您将在相同的内存上工作。 切片是指针,因此切片的默认“复制”意味着复制地址本身,而不是在该地址找到的值。
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())
}
如您所见,每个元素的所有地址都是相同的,并且当您从一个变量项中更改一个值时,另一项上可以使用相同的值。
Go不支持在指向不同结构的指针之间进行强制转换。 如果确实需要,可以使用包含特殊类型unsafe.Pointer
unsafe
包,该包支持其他类型不支持的操作:
- 任何类型的指针值都可以转换为Pointer。
- 指针可以转换为任何类型的指针值。
- 可以将uintptr转换为Pointer。
- 指针可以转换为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]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.