go struct结构体之间的转换

莱莱  金牌会员 | 2023-4-17 16:29:35 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 918|帖子 918|积分 2754

原文链接:https://www.zhoubotong.site/post/94.html
说下背景吧,大家在开发中可能在不同的目录(package)下定义了相同的struct(属性参数完全一样如名字、个数和类型),在方法调用传参数的时候,可能是用到了其中某一个struct的引用。
那么这里就牵扯到相互间的转换:直接上demo:
  1. package main
  2. import "fmt"
  3. type PackgeAResp struct { // 比如这里是其他目录xxx 下定义的struct
  4.     ID   int    `gorm:"column:id;" json:"taskId" form:"taskId"`
  5.     Name string `gorm:"column:name;" json:"name" form:"name"`
  6. }
  7. type PackgeBResp struct { // 比如这里是其他目录yyy 下定义的struct
  8.     ID   int    `gorm:"column:id;" json:"taskId" form:"taskId"`
  9.     Name string `gorm:"column:name;" json:"name" form:"name"`
  10. }
  11. func demo(info *PackgeBResp) { // 定义参数为目录yyy 下定义的struct
  12.     fmt.Printf("%#v", info)
  13. }
  14. func main() {
  15.     info := &PackgeAResp{ID: 1, Name: "test"}
  16.     demo(info)
  17.     //demo(&PackgeBResp{ID: info.ID, Name: info.Name}) //通过这样可以实现,但是比较lower的就是重新赋值,参数多的情况下你的一个个写入
  18. }
复制代码
显然类型不匹配:cannot use info (variable of type *PackgeAResp) as *PackgeBResp value in argument to demo
两个相同struct是可以强转换的:
  1. info := &PackgeAResp{ID: 1, Name: "test"}
  2. demo((*PackgeBResp)(info))
复制代码

注意:两个结构体需要有完全相同的字段(名字、个数和类型)。
再举个例子:
  1. package main
  2. import "fmt"
  3. type Person struct {
  4.     Name string
  5.     Age  int
  6. }
  7. type Employee struct {
  8.     Name string
  9.     Age  int
  10. }
  11. func main() {
  12.     var p Person = Person{Name: "John", Age: 30}
  13.     var e Employee = Employee{Name: "Babala", Age: 18}
  14.     p = Person(e) // 把 e 转成Person
  15.     fmt.Println(p)
  16. }
  17. //输出 {Babala 18}
复制代码
当然我们还可以通过结构体进行type重新定义(相当于取别名)的方式实现,Golang认为是新的数据类型,但是相互间是可以强转的:
  1. type Person struct {
  2.     Name string
  3.     Age  int
  4. }
  5. type Employee struct {
  6.     Name string
  7.     Age  int
  8. }
  9. type E Employee
  10. func main() {
  11.     var s1 Person = Person{Name: "John", Age: 30}
  12.     var s2 E = E{Name: "Babala", Age: 18}
  13.     s1 = Person(s2) // s2 转成Person结构体
  14.     fmt.Println(s1) //{Babala 18}
  15. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表