首页 > 其他分享 >36-golang动态创建类

36-golang动态创建类

时间:2023-06-27 09:02:11浏览次数:41  
标签:return func nil 36 动态创建 st golang Student ok

动态创建类

(1.)使用反射创建类

import `reflect`

var typeRegistry = make(map[string]reflect.Type)

func RegisterType(elem interface{}) {
	t := reflect.TypeOf(elem).Elem()
	typeRegistry[t.Name()] = t
}

func NewStruct(name string) (interface{}, bool) {
	elem, ok := typeRegistry[name]
	if !ok {
		return nil, false
	}
	return reflect.New(elem).Elem().Interface(), true
}

(2.)使用示例

// 定义结构体
type Student struct {
      Name string
      Age int
}

// 初始化时注册类型
func init() {
	RegisterType((*Student)(nil))
}

// 获取对象
func getObj(structName string) (*Student, error) {
	st, ok := NewStruct(structName)
	if !ok {
		return nil, errors.New("new struct not ok")
	}

	student, ok := st.(Student)
	if !ok {
		return nil, fmt.Errorf("assert st to Student error,st:%T", st)
	}
      // 给结构体字段赋值
      student.Name = "jones"
      student.Age = 18
	return &student, nil
}

func main(){
      // 获取一个对象
      stu := getObj("Student")
      fmt.Printf("stu:%+v",stu)
}

参考链接

https://blog.csdn.net/qq_41257365/article/details/114108970
https://blog.csdn.net/whatday/article/details/113773167

标签:return,func,nil,36,动态创建,st,golang,Student,ok
From: https://www.cnblogs.com/tomtellyou/p/17507705.html

相关文章

  • 四期day36 打包和其他
    day36打包和其他今日概要:exe打包离线包其他分享1.exe打包pipinstallpyinstaller注意事项:支持mac、win(windows建议使用python3.6.8)。配合虚拟环境打包。-项目crm-环境crm -python.exe -Scripts -pip.exe -pyinstaller.exe -Lib -site-packag......
  • 福昕Foxit PDF远程代码执行漏洞CVE-2023-27363分析与复现
    漏洞概述福建福昕软件开发股份有限公司是一家国际化运营的PDF电子文档解决方案提供厂商,提供文档的生成、转换、显示、编辑、搜索、打印、存储、签章、表单、保护、安全分发管理等涵盖文档生命周期的产品技术与解决方案。其下产品FoxitPDFReader和FoxitPDFEditor的javascript函......
  • 36. 图的遍历
    一、深度优先搜索  深度优先搜索(DepthFirstSerch,DFS)类似于树的先序遍历。深度优先遍历,从初始节点出发,初始访问节点可能有多个邻接节点,深度优先遍历的策略就是首先访问第一个邻接节点,然后在以这个被访问的邻接节点作为初始节点,访问它的第一个邻接节点。我们可以这样理解:每次都......
  • ASM disk group mount fails with ORA-15036: disk is truncated [ID 1077175.1]
     ASMdiskgroupmountfailswithORA-15036:diskistruncated[ID1077175.1]--------------------------------------------------------------------------------  修改时间05-OCT-2011    类型PROBLEM    状态PUBLISHED  InthisDocument Sympto......
  • D365: 将多个关联的表数据转换为JSON格式
    最近碰到一个需求,将D365系统中的多个关联表的数据转换成JSON格式导出然后上传到blobstorage,实现方式记录一下,以便将来使用首先在调用是引用usingNewtonsoft.Json,usingSystem.IO引用后,我们用到两个classSystem.IO.StringWriterNewtonsoft.Json.JsonTextWriter分别定义这......
  • golang使用core dump分析定位程序崩溃问题
     原创 萧瑟 golang面试经典讲解 2023-06-2319:05 发表于上海收录于合集#go语言6个#go6个##go工具15个一、前言coredump是一个包含着意外终止的程序其内存快照的文件。这个文件可以被用来事后调试(debugging)以了解为什么会发生崩溃,同时了解其中涉及到的变量。通......
  • golang入门,基础语法demo(1)
    packagemainimport"fmt"funcmain(){//声明变量varaint//使用var关键字声明变量a,类型为inta=1//赋值fmt.Println(a)//类型推导//使用:=自动推导类型并声明变量b,其类型为stringb:="helloworld"fmt.Pr......
  • GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)
    fyne中文乱码的两种解决方法方法一(使用embed):embed是Go1.16新特性,以后会有专门的介绍。1、拷贝字体到项目目录项目根目录下新建resource目录,把字体文件拷贝到其中。2、在resource目录下新建resource_export.go文件。resource_export.go代码:packageresourceimport_"emb......
  • Golang中的参数传递
    Golang中的值传递和引用传递引言在编程领域中,Golang是一种强大而受欢迎的编程语言。它提供了丰富的功能和灵活性,使得开发者能够快速构建高效的应用程序。在Golang中,值传递和引用传递是非常重要的概念,对于理解程序的行为和优化代码至关重要。本文将深入探讨Golang中的值传递......
  • Golang技巧:如何为函数参数添加默认值?
    你是否是那些在Go中缺少默认参数值而感到沮丧的众多程序员之一?如果是的话,你绝对不是一个人!如何为函数参数添加默认值。你是否曾因为Go语言没有默认参数值而感到沮丧?好消息是,你并不孤单!这个令人讨厌的限制会让你的代码更加繁琐,难以阅读。每次都需要写额外的代码来检查参数是否......