新手求解 golang 动态new struct

dogo_小小人物 发布于 2014/01/18 00:10
阅读 4K+
收藏 2
Go

如题: 如果我有一个struct  

type test struct{

    Name string

    Sex int

}

func main(){

    

    str := "tset" // 这里的test 可以是我在form 表单里面传递过来的一个数据

    obj := new(str) // 请问一下,有没有什么办法可以实现我这样的???

}


加载中
0
itfanr
itfanr
//先手动自己弄个map 里面先用类名 映射到一个空实例 然后通过类似这种方法
getStructObj(structName string){
   //  这里用map去找对应的映射实例    // 并返回
}

我抄的群里的回答




0
bianweiall
bianweiall
obj:=test{Name:str}
bianweiall
bianweiall
我看的不是很明白,是不是说像orm样的,定义了一堆的struct,然后随便丢一个这堆类型的对象进去都可以,是这样吗?
dogo_小小人物
dogo_小小人物
额??我说的不是这个意思, 你注意看看我写的代码 ,
0
君陌
君陌

go是静态语言,像php一样直接通过字符串的值来当类型的话编译是没法通过的,因为编译器在编译的时候不能确定这是什么样的类型。

如果struct的名字是有限个的,可以用switch来做


dogo_小小人物
dogo_小小人物
这不确定的,你是说,去判断 case data == "test" : new(test) ? 是这个意思吗?
0
五杀联盟
五杀联盟
五杀联盟
回复 @php_小小人物 : 一楼正解
dogo_小小人物
dogo_小小人物
你把我的意思理解错了,我说的是,我有一个struct 叫做 test ,那么我想根据我我传过来我参数,去动态实例化一个对象 ,
0
dogo_小小人物
dogo_小小人物

引用来自“itfanr”的答案

//先手动自己弄个map 里面先用类名 映射到一个空实例 然后通过类似这种方法
getStructObj(structName string){
   //  这里用map去找对应的映射实例    // 并返回
}

我抄的群里的回答




嘿嘿
0
君陌
君陌

引用来自“君陌”的答案

go是静态语言,像php一样直接通过字符串的值来当类型的话编译是没法通过的,因为编译器在编译的时候不能确定这是什么样的类型。

如果struct的名字是有限个的,可以用switch来做


回复 @php_小小人物 : 是的。你在答案里抄的那个代码真正实现起来会很麻烦。go不像php,随便可以返回一个任意类型的变量,go的返回值也一定要是确定类型的,那个getStructObj连返回值类型都没,根本不能return obj。当然 你可以返回一个interface{}类型的Obj,但是当你想把这个obj当成test实例来用的时候,仍然要用类型断言obj.(test)来访问,没有任何实质上的区别。


其它人估计是没用过PHP?根本没理解你提问的意图。。

0
dogo_小小人物
dogo_小小人物

引用来自“君陌”的答案

引用来自“君陌”的答案

go是静态语言,像php一样直接通过字符串的值来当类型的话编译是没法通过的,因为编译器在编译的时候不能确定这是什么样的类型。

如果struct的名字是有限个的,可以用switch来做


回复 @php_小小人物 : 是的。你在答案里抄的那个代码真正实现起来会很麻烦。go不像php,随便可以返回一个任意类型的变量,go的返回值也一定要是确定类型的,那个getStructObj连返回值类型都没,根本不能return obj。当然 你可以返回一个interface{}类型的Obj,但是当你想把这个obj当成test实例来用的时候,仍然要用类型断言obj.(test)来访问,没有任何实质上的区别。


其它人估计是没用过PHP?根本没理解你提问的意图。。

嗯 ,是的,这就是觉得go 这样弄好麻烦 ,我就是想根据当前的 控制器的名字来动态调用 new 一个和当前控制器名一样的模型类,, 谢谢你。
0
君陌
君陌

引用来自“php_小小人物”的答案

引用来自“君陌”的答案

引用来自“君陌”的答案

go是静态语言,像php一样直接通过字符串的值来当类型的话编译是没法通过的,因为编译器在编译的时候不能确定这是什么样的类型。

如果struct的名字是有限个的,可以用switch来做


回复 @php_小小人物 : 是的。你在答案里抄的那个代码真正实现起来会很麻烦。go不像php,随便可以返回一个任意类型的变量,go的返回值也一定要是确定类型的,那个getStructObj连返回值类型都没,根本不能return obj。当然 你可以返回一个interface{}类型的Obj,但是当你想把这个obj当成test实例来用的时候,仍然要用类型断言obj.(test)来访问,没有任何实质上的区别。


其它人估计是没用过PHP?根本没理解你提问的意图。。

嗯 ,是的,这就是觉得go 这样弄好麻烦 ,我就是想根据当前的 控制器的名字来动态调用 new 一个和当前控制器名一样的模型类,, 谢谢你。

但是其实getStructObj虽然不能直接返回不同类型的obj,但是如果不同类型实现了相同的interface的话,还是可以当成相同的接口类型一样返回的,当然这样你只能在返回的接口里使用接口实现的几个方法而不能直接使用obj.Name之类的变量了。

当然这要具体看你的需求

0
dogo_小小人物
dogo_小小人物

引用来自“君陌”的答案

引用来自“php_小小人物”的答案

引用来自“君陌”的答案

引用来自“君陌”的答案

go是静态语言,像php一样直接通过字符串的值来当类型的话编译是没法通过的,因为编译器在编译的时候不能确定这是什么样的类型。

如果struct的名字是有限个的,可以用switch来做


回复 @php_小小人物 : 是的。你在答案里抄的那个代码真正实现起来会很麻烦。go不像php,随便可以返回一个任意类型的变量,go的返回值也一定要是确定类型的,那个getStructObj连返回值类型都没,根本不能return obj。当然 你可以返回一个interface{}类型的Obj,但是当你想把这个obj当成test实例来用的时候,仍然要用类型断言obj.(test)来访问,没有任何实质上的区别。


其它人估计是没用过PHP?根本没理解你提问的意图。。

嗯 ,是的,这就是觉得go 这样弄好麻烦 ,我就是想根据当前的 控制器的名字来动态调用 new 一个和当前控制器名一样的模型类,, 谢谢你。

但是其实getStructObj虽然不能直接返回不同类型的obj,但是如果不同类型实现了相同的interface的话,还是可以当成相同的接口类型一样返回的,当然这样你只能在返回的接口里使用接口实现的几个方法而不能直接使用obj.Name之类的变量了。

当然这要具体看你的需求

嗯 ,我现在是这样做的

var ModelObj map[string]interface{} = map[string]interface{}{

"Member": new(Member),
}


func GetModObj(mod string) interface{} {
if ModelObj[mod] != nil {
return ModelObj[mod]
} else {
return nil
}
}
0
dogo_小小人物
dogo_小小人物

引用来自“君陌”的答案

引用来自“php_小小人物”的答案

引用来自“君陌”的答案

引用来自“君陌”的答案

go是静态语言,像php一样直接通过字符串的值来当类型的话编译是没法通过的,因为编译器在编译的时候不能确定这是什么样的类型。

如果struct的名字是有限个的,可以用switch来做


回复 @php_小小人物 : 是的。你在答案里抄的那个代码真正实现起来会很麻烦。go不像php,随便可以返回一个任意类型的变量,go的返回值也一定要是确定类型的,那个getStructObj连返回值类型都没,根本不能return obj。当然 你可以返回一个interface{}类型的Obj,但是当你想把这个obj当成test实例来用的时候,仍然要用类型断言obj.(test)来访问,没有任何实质上的区别。


其它人估计是没用过PHP?根本没理解你提问的意图。。

嗯 ,是的,这就是觉得go 这样弄好麻烦 ,我就是想根据当前的 控制器的名字来动态调用 new 一个和当前控制器名一样的模型类,, 谢谢你。

但是其实getStructObj虽然不能直接返回不同类型的obj,但是如果不同类型实现了相同的interface的话,还是可以当成相同的接口类型一样返回的,当然这样你只能在返回的接口里使用接口实现的几个方法而不能直接使用obj.Name之类的变量了。

当然这要具体看你的需求

嗯 ,我现在是这样做的

var ModelObj map[string]interface{} = map[string]interface{}{

"Member": new(Member),
}


func GetModObj(mod string) interface{} {
if ModelObj[mod] != nil {
return ModelObj[mod]
} else {
return nil
}
}
返回顶部
顶部