golang Golang反思范例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang Golang反思范例相关的知识,希望对你有一定的参考价值。

package main

import (
	"fmt"
	"reflect"
)

type Foo struct {
	FirstName string `tag_name:"tag 1"`
	LastName  string `tag_name:"tag 2"`
	Age       int    `tag_name:"tag 3"`
}

func (f *Foo) reflect() {
	val := reflect.ValueOf(f).Elem()

	for i := 0; i < val.NumField(); i++ {
		valueField := val.Field(i)
		typeField := val.Type().Field(i)
		tag := typeField.Tag

		fmt.Printf("Field Name: %s,\t Field Value: %v,\t Tag Value: %s\n", typeField.Name, valueField.Interface(), tag.Get("tag_name"))
	}
}

func main() {
	f := &Foo{
		FirstName: "Drew",
		LastName:  "Olson",
		Age:       30,
	}

	f.reflect()
}

实例新类型(Golang)

【中文标题】实例新类型(Golang)【英文标题】:Instance new Type (Golang) 【发布时间】:2012-04-29 21:52:47 【问题描述】:

谁能告诉我如何从一个字符串创建一个新的 Type 实例?反思?

有一些示例,但它们适用于较旧的(Go 1 之前的版本)语言 [:(]

【问题讨论】:

请澄清一下您的问题,我不清楚。最后的'('之后似乎也不完整。 【参考方案1】:

所以,如果我正确理解了您的问题,那么您是在询问当您将类型名称作为字符串时如何创建对象。因此,例如,您可能有一个字符串“MyStruct”,并且您想创建一个这种类型的对象。

不幸的是,这并不容易,因为 Go 是一种静态类型语言,并且链接器会消除死代码(或其中的内联部分)。因此,不能保证最终的可执行文件甚至会包含“MyStruct”的代码。

但是,您可以手动维护全局 map[string]reflect.Type。例如,通过在定义此类可发现类型的包的 init() 函数中初始化此映射。这也将告诉编译器您正在使用这些类型。之后,您可以使用此映射查找您要创建的类型的 reflect.Type,并使用 reflect.New 获取指向该类型的新对象的指针(存储为 reflect.Value)。您可以使用以下方式将对象提取到接口中:

reflect.New(yourtype).Elem().Interface()

Elem() 将取消引用指针,Interface() 将返回反射值作为interface。详情请见The Laws of Reflection。

PS:可能有更好的方法来构建您的程序,它甚至不需要反射,并且可以让编译器捕获更多错误。例如,您是否考虑过使用factory method?另一个简单的解决方案可能是维护一个map[string]func() interface 的函数,可以调用这些函数来创建具有该名称的新对象。

【讨论】:

如何在 Go 中实现工厂方法?【参考方案2】:

具有预定义构造函数的工厂可以基于以下内容:

package main

import (
    "fmt"
)

type Creator func() interface

type A struct 
    a int


type B struct 
    a bool


func NewA() interface 
    return new(A)


func NewB() interface 
    return new(B)


func main() 
    m := map[string]Creator
    m["A"] = NewA
    m["B"] = NewB
    for k, v := range m 
        fmt.Printf("%v -> %v\n", k, v())
    

【讨论】:

以上是关于golang Golang反思范例的主要内容,如果未能解决你的问题,请参考以下文章

实例新类型(Golang)

源码分析golang协程闭包数据陷阱

『GCTT 出品』并行化 Golang 文件 IO

Golang 学习之路

Golang 入门

Golang入门到项目实战 第一个golang应用