golang 动态创建 struct

9-21 1,811 views

引用

package main

import (
    "fmt"
    "reflect"

    "github.com/boringwork/godemo/class/stu"
)

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

func registerType(elem interface{}) {
    t := reflect.TypeOf(elem).Elem()
    typeRegistry[t.Name()] = t
    fmt.Println(t.PkgPath() + "/" + t.Name()) // echo github.com/boringwork/godemo/class/stu/Student
}

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

func init() {
    registerType((*test)(nil))
    registerType((*stu.Student)(nil))

}

type test struct {
    Name string
    Sex  int
}

type test2 struct {
    test
    age int
}

func main() {
    structName := "test2"

    s, ok := newStruct(structName)
    if !ok {
        fmt.Println("没有")
        return
    }

    fmt.Println(s, reflect.TypeOf(s))

    t, ok := s.(test2)
    if !ok {
        return
    }
    t.Name = "i am test"
    fmt.Println(t, reflect.TypeOf(t))
}

How can I host my public package on my personal domain?

<blockquote class="reddit-card" > <a href="https://www.reddit.com/r/golang/comments/mn2zsa/how_can_i_host_my_public_package_on_my_pe...

阅读全文

golang skia demo

skia build 1. 下载安装 depot_tools git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git' export PATH="${PWD}/depot_tools:${...

阅读全文

Go 语言编译器的 “//go:” 详解

前言 C 语言的 #include 一上来不太好说明白 Go 语言里 //go: 是什么,我们先来看下非常简单,也是几乎每个写代码的人都知道的东西:C 语言的 #include。 我...

阅读全文

欢迎留言