疯狂编程网

  • 首页
  • 后端
    • GOLANG
    • PHP
  • 前端
  • 客户端
  • 服务器
  • AIGC
  • 开发工具
  • 代码人生
  • 关于本站
    • 联系我们
    • 免责声明
  1. 首页
  2. 后端
  3. GOLANG
  4. 正文

go struct结构体之间的转换

2023年5月10日 223点热度 0人点赞 0条评论

原文链接: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}
}
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。
标签: golang
最后更新:2023年5月10日

大明

靠写代码养家的开发者。

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 疯狂编程网. ALL RIGHTS RESERVED.

京ICP备2022013580号-1