gpt4 book ai didi

高语 : Memory allocation for type inheritance and casting in Go

转载 作者:IT王子 更新时间:2023-10-29 02:26:30 25 4
gpt4 key购买 nike

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

更新:好的,对于 slice 来说没有内存分配,因为 slice 是指针。

但我有更一般的问题。结构怎么样?似乎它复制了: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)

最佳答案

没有。您将处理相同的内存。 slice 是指针,因此 slice 的默认“复制”意味着复制地址本身,而不是在该地址找到的值。

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

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

关于高语 : Memory allocation for type inheritance and casting in Go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36643050/

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