首页 > 其他分享 >go struct结构体之间的转换

go struct结构体之间的转换

时间:2023-04-17 14:25:00浏览次数:55  
标签:info 转换 struct Age Person go type Name

原文链接: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}
}

标签:info,转换,struct,Age,Person,go,type,Name
From: https://www.cnblogs.com/phpper/p/17325687.html

相关文章

  • 【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介迭代器模式(IteratorPattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等,这些集合都有自......
  • mongo db 异常关闭后重启报错
    报错信息:abouttoforkchildprocess,waitinguntilserverisreadyforconnections.forkedprocess:22200ERROR:childprocessfailed,exitedwitherrornumber1Toseeadditionalinformationinthisoutput,startwithoutthe"--fork"option解决办法......
  • 围棋qingGo_0_0
    qingGo_0_0需求:1,设计一个9路棋盘,对弈双方轮流落子2,已落子的点不能再落子3,棋盘上没有空点时,统计双方棋子数量,多的一方赢设计:1,使用QipanModel类建立棋盘模型1classQipanModel():2def__init__(self,n=9):3self.n=n#棋盘路数,默认9路棋盘4......
  • 类型转换
    不同类型的数据要转换成同一类型,然后进行计算。  ......
  • django restframework的简单使用
    djangorestframework的简单使用1.快速上手配置:(pipinstalldjangorestframework==3.12.4)#settings.pyINSTALLED_APPS=['rest_framework']REST_FRAMEWORK={#DRF的相关配置后面都在这里}urls和views#urls.pyfromdjango.urlsimportpathfr......
  • Go 语言环境安装
    转载自:https://www.runoob.com/go/go-environment.html============= Go语言支持以下系统:LinuxFreeBSDMacOSX(也称为Darwin)Windows安装包下载地址为:https://golang.org/dl/。如果打不开可以使用这个地址:https://golang.google.cn/dl/。各个系统对应的包名:操......
  • Go 每日一库之 fsnotify
    上一篇文章Go每日一库之viper中,我们介绍了viper可以监听文件修改进而自动重新加载。其内部使用的就是fsnotify这个库,它是跨平台的。今天我们就来介绍一下它。快速使用先安装:$gogetgithub.com/fsnotify/fsnotify后使用:packagemainimport("log""github.com/......
  • Django基础 - 09路由URL控制与解析
     一、URL路由配置1.1 主路由:主程序目录下的urls.py; 对应属性ROOT_URLCONFurlpatterns=[path('admin/',admin.site.urls),path('index/',index),#配置子路由#include()导入mainapp模块下urls.py中声明的所有子路由path('user/',include......
  • Django基础 - 10请求与响应
     环境准备#1.开启一个新的项目advanceDjango(venv)E:\PythonLearn\djangoDemo>django-adminstartprojectadvanceDjango#2.配置项目同名APP下的settings.py,advanceDjango/advanceDjango/settings.pyALLOWED_HOSTS=['*']TEMPLATES=['DIRS�......
  • Django基础 - 06Model模型的关联关系及对象继承
     一、 一对一关系:实名认证表一对一关系: models.OneToOneField主表的数据是相对重要的(UserEntity), 从表需要主动声明关系(RealProfile)对象获取: 从表获取主表数据, 直接使用字段, 对象.字段名.属性名; 主表获取从表数据: 隐性的, 对象.模型名.属性名1.1 声明一对一......