go struct結構體之間的轉換

原文鏈接:https://www.zhoubotong.site/post/94.html
說下背景吧,大家在開發中可能在不同的目錄(package)下定義了相同的struct(屬性參數完全一樣如名字、個數和類型),在方法調用傳參數的時候,可能是用到了其中某一個struct的引用。

那麼這裏就牽扯到相互間的轉換:直接上demo:

package main

import "fmt"

type PackgeAResp struct { // 比如這裏是其他目錄xxx 下定義的struct
    ID   int    `gorm:"column:id;" json:"taskId" form:"taskId"`
    Name string `gorm:"column:name;" json:"name" form:"name"`
}

type PackgeBResp struct { // 比如這裏是其他目錄yyy 下定義的struct
    ID   int    `gorm:"column:id;" json:"taskId" form:"taskId"`
    Name string `gorm:"column:name;" json:"name" form:"name"`
}

func demo(info *PackgeBResp) { // 定義參數爲目錄yyy 下定義的struct
    fmt.Printf("%#v", info)
}
func main() {
    info := &PackgeAResp{ID: 1, Name: "test"}
    demo(info)
    //demo(&PackgeBResp{ID: info.ID, Name: info.Name}) //通過這樣可以實現,但是比較lower的就是重新賦值,參數多的情況下你的一個個寫入
}

顯然類型不匹配:cannot use info (variable of type *PackgeAResp) as *PackgeBResp value in argument to demo

兩個相同struct是可以強轉換的:

info := &PackgeAResp{ID: 1, Name: "test"}
demo((*PackgeBResp)(info))

image.png

注意:兩個結構體需要有完全相同的字段(名字、個數和類型)。

再舉個例子:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

type Employee struct {
    Name string
    Age  int
}

func main() {
    var p Person = Person{Name: "John", Age: 30}
    var e Employee = Employee{Name: "Babala", Age: 18}
    p = Person(e) // 把 e 轉成Person
    fmt.Println(p)
}
//輸出 {Babala 18}

當然我們還可以通過結構體進行type重新定義(相當於取別名)的方式實現,Golang認爲是新的數據類型,但是相互間是可以強轉的:

type Person struct {
    Name string
    Age  int
}

type Employee struct {
    Name string
    Age  int
}
type E Employee

func main() {
    var s1 Person = Person{Name: "John", Age: 30}
    var s2 E = E{Name: "Babala", Age: 18}
    s1 = Person(s2) // s2 轉成Person結構體
    fmt.Println(s1) //{Babala 18}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章