原文链接: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}
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |