为了账号安全,请及时绑定邮箱和手机立即绑定

GoLang:Go 中类型继承和强制转换的内存分配

GoLang:Go 中类型继承和强制转换的内存分配

Go
UYOU 2022-01-04 14:08:59
在 Go 中,如果我有一个继承自的自定义类型,假设我将一个整数数组转换为我的自定义类型,那么它会涉及新的内存分配吗?http://play.golang.org/p/cNpKELZ3X- :package mainimport (    "fmt")type MyIntsArray []intfunc (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/BV086ZAeGfpackage mainimport (    "fmt")type MyType1 struct {    Val int    Values []int}type MyType2 MyType1func 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 MyType2prog.go:17: invalid indirect of MyType2(t1) (type MyType2)
查看完整描述

3 回答

?
牧羊人nacy

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())

}

如您所见,每个元素的所有地址都是相同的,并且当您更改一个变量项的一个值时,另一个值也可用。


查看完整回答
反对 回复 2022-01-04
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您的代码只需编译

t2 = (*MyType2)(t1)

http://play.golang.org/p/lUGo-mxAOa


查看完整回答
反对 回复 2022-01-04
?
慕森王

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]}


查看完整回答
反对 回复 2022-01-04
  • 3 回答
  • 0 关注
  • 323 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信