原文鏈接: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))
注意:兩個結構體需要有完全相同的欄位(名字、個數和型別),
再舉個例子:
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}
}
無論從事什么行業,只要做好兩件事就夠了,一個是你的專業、一個是你的人品,專業決定了你的存在,人品決定了你的人脈,剩下的就是堅持,用善良專業和真誠贏取更多的信任,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550308.html
標籤:其他
上一篇:Java筆記(17) 反射