第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

GoLang:Go 中類(lèi)型繼承和強(qiáng)制轉(zhuǎn)換的內(nèi)存分配

GoLang:Go 中類(lèi)型繼承和強(qiáng)制轉(zhuǎn)換的內(nèi)存分配

Go
UYOU 2022-01-04 14:08:59
在 Go 中,如果我有一個(gè)繼承自的自定義類(lèi)型,假設(shè)我將一個(gè)整數(shù)數(shù)組轉(zhuǎn)換為我的自定義類(lèi)型,那么它會(huì)涉及新的內(nèi)存分配嗎?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()))}更新:好的,對(duì)于切片沒(méi)有內(nèi)存分配,因?yàn)榍衅侵羔?。但我有更普遍的?wèn)題。結(jié)構(gòu)體呢?似乎它復(fù)制了:http : //play.golang.org/p/NXgM8Cr-qj,這是因?yàn)槭褂弥殿?lèi)型。我想弄清楚是否可以將指向結(jié)構(gòu)的指針轉(zhuǎn)換為不同類(lèi)型的指針。像這樣的東西: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貢獻(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è)值也可用。


查看完整回答
反對(duì) 回復(fù) 2022-01-04
?
人到中年有點(diǎn)甜

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

您的代碼只需編譯

t2 = (*MyType2)(t1)

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


查看完整回答
反對(duì) 回復(fù) 2022-01-04
?
慕森王

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


查看完整回答
反對(duì) 回復(fù) 2022-01-04
  • 3 回答
  • 0 關(guān)注
  • 370 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)