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

GoLang:Go中类型继承和强制转换的内存分配,go,Go,在Go中,如果我从一个整数片段继承了一个自定义类型,如果我将一个整数数组转换为自定义类型,它会涉及新的内存分配吗 : 更新:好的,对于片,没有内存分配,因为片是指针 但我有一个更一般的问题。结构呢?似乎它是复制的:这是因为使用了值类型 我试图弄清楚是否可以将指向结构的指针强制转换为其他类型的指针。大概是这样的: 不,您将使用相同的内存。片是指针,因此片的默认“复制”意味着复制地址本身,而不是在该地址找到的值 如您所见,每个元素的所有地址都是相同的,当您从一个变量项更改一个值时,另一个变量项上的

在Go中,如果我从一个整数片段继承了一个自定义类型,如果我将一个整数数组转换为自定义类型,它会涉及新的内存分配吗

:

更新:好的,对于片,没有内存分配,因为片是指针

但我有一个更一般的问题。结构呢?似乎它是复制的:这是因为使用了值类型

我试图弄清楚是否可以将指向结构的指针强制转换为其他类型的指针。大概是这样的:


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


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

否。您将使用相同的内存。片是指针,因此片的默认“复制”意味着复制地址本身,而不是在该地址找到的值


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

Go不支持在指向不同结构的指针之间强制转换。如果确实需要,您可以使用包含特殊类型的
不安全的
包。指针
支持其他类型不支持的操作:

  • 任何类型的指针值都可以转换为指针
  • 指针可以转换为任何类型的指针值
  • uintptr可以转换为指针
  • 指针可以转换为uintptr

代码将打印:

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

Go不支持在指向不同结构的指针之间强制转换。如果确实需要,您可以使用包含特殊类型的
不安全的
包。指针
支持其他类型不支持的操作:

  • 任何类型的指针值都可以转换为指针
  • 指针可以转换为任何类型的指针值
  • uintptr可以转换为指针
  • 指针可以转换为uintptr

代码将打印:

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

您的代码只需使用

t2 = (*MyType2)(t1)

您的代码只需

t2 = (*MyType2)(t1)


没有类型继承这样的东西。这是类型转换。请参阅。使用“%p”及其指针尝试printf的可能副本,您将自己看到它不,它不会。您可以更改myInts中的值,它也将应用于myIntsArr@Anzel回答也是一种检查方法。好的,它对slice有效,但我有一个更一般的问题。结构呢?这似乎是复制:但这是因为使用值类型。我试图弄清楚是否可以将指向结构的指针强制转换为其他类型的指针。类似这样的东西:没有类型继承这样的东西。这是类型转换。请参阅。使用“%p”及其指针尝试printf的可能副本,您将自己看到它不,它不会。您可以更改myInts中的值,它也将应用于myIntsArr@Anzel回答也是一种检查方法。好的,它对slice有效,但我有一个更一般的问题。结构呢?这似乎是复制:但这是因为使用值类型。我试图弄清楚是否可以将指向结构的指针强制转换为其他类型的指针。类似这样:好吧,对于切片来说,这是合理的。但我尝试过结构,似乎它确实创建了一个副本:在该结构中,有一个切片是指针。是一样的。那片还是一样的。对于int、float、string,复制值;对于slice、map、pointer,复制指针的值/地址。您必须创建一个克隆函数,在该函数中创建一个具有新切片的新结构,然后为每个切片元素复制源结构切片中的值。等等,我可能误解了这个问题。:)你有一个指针类型。这是您在顶部注释的示例,而不是您在此处的注释。这是您的示例中出现错误的修复。您不能从指针强制转换为结构,您可以使用指针或非指针类型,对于切片来说,这是合理的。但我尝试过结构,似乎它确实创建了一个副本:在该结构中,有一个切片是指针。是一样的。那片还是一样的。对于int、float、string,复制值;对于slice、map、pointer,复制指针的值/地址。您必须创建一个克隆函数,在该函数中创建一个具有新切片的新结构,然后为每个切片元素复制源结构切片中的值。等等,我可能误解了这个问题。:)你有一个指针类型。这是您在顶部注释的示例,而不是您在此处的注释。这是您的示例中出现错误的修复。你不能从指针强制转换到struct,你可以使用指针,也可以使用非指针类型我喜欢堆栈溢出,这会得到两票和一个可接受的响应,而我只有一票,在解释内容的同时,还解决了你的问题。我想这就是我们生活的世界,每个人都只想复制粘贴代码而不去思考。干得好,op.@Radoo肯定你的答案更全面。我现在就投赞成票。我喜欢堆栈溢出,它得到两票和一个可接受的响应,而我得到一票,在解释东西的时候,再加上解决你的问题。我想这就是我们生活的世界,每个人都只想复制粘贴代码而不去思考。干得好,op.@Radoo肯定你的答案更全面。我现在就投赞成票。
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]}
t2 = (*MyType2)(t1)