Golang,从字符串中获取类型的变量

huangapple go评论81阅读模式
英文:

Golang, variable with type from string

问题

可以使用反射来实现根据字符串创建具有相应类型的变量。以下是一个示例代码:

package main

import (
	"fmt"
	"reflect"
)

type FirstType struct {
	// ...
}

type SecondType struct {
	// ...
}

func main() {
	var1 := "Second"

	// 获取类型名称
	typeName := var1 + "Type"

	// 根据类型名称创建类型
	typeObj, _ := getTypeByName(typeName)

	// 创建变量
	variable := reflect.New(typeObj).Elem()

	fmt.Printf("Type: %T\nValue: %v\n", variable.Interface(), variable.Interface())
}

// 根据类型名称获取类型对象
func getTypeByName(typeName string) (reflect.Type, error) {
	// 遍历当前包中的所有类型
	for _, pkg := range reflect.ValueOf(main).Elem().FieldByName("Type").Interface().([]interface{}) {
		// 获取类型对象
		typeObj := reflect.TypeOf(pkg).Elem()

		// 检查类型名称是否匹配
		if typeObj.Name() == typeName {
			return typeObj, nil
		}
	}

	return nil, fmt.Errorf("Type not found: %s", typeName)
}

这段代码首先定义了两个类型 FirstTypeSecondType。然后,根据给定的字符串 var1,我们将其与字符串 "Type" 进行拼接,得到类型名称 "SecondType"。接下来,我们使用反射获取类型名称对应的类型对象,并使用 reflect.New 创建一个新的变量。最后,我们打印出变量的类型和值。

请注意,这只是一个示例代码,实际应用中可能需要根据具体情况进行适当的修改和错误处理。

英文:

Is it possible to create variable with type from string?

Example:<br>
&nbsp;I have two types:

type FirstType struct {
    ...
}

type SecondType struct {
    ...
}

// also I have a string variable
var1 := &quot;Second&quot;

I want to create variable with type - String value + &quot;Type&quot;:

var variable = []var1+&quot;Type&quot; // slice of &quot;SecondType&quot;

Expected result is like in this case:

var variable = []SecondType

Thanks!

答案1

得分: 7

这是不可能的。Go语言不提供创建静态未知类型变量的功能。变量的类型始终是静态已知的。考虑使用接口代替。

英文:

This is not possible. Go does not provide functionality to create variables of types that are not known statically. The type of a variable is always known statically. Consider using interfaces instead.

huangapple
  • 本文由 发表于 2014年10月26日 03:03:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/26566124.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定