Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 将接口{}强制转换为特定类型_Google App Engine_Go - Fatal编程技术网

Google app engine 将接口{}强制转换为特定类型

Google app engine 将接口{}强制转换为特定类型,google-app-engine,go,Google App Engine,Go,我正在尝试创建一个用于保存到数据存储的通用函数。下面两个示例中的第二个可以工作,但第一个示例给了我一个“datastore:invalid entity type”错误 目前我对围棋一无所知,但我试图减少我的无知。是否有某种方法可以将第一个示例中的对象强制转换为名称保存在字符串中的类型。例如某种反思。我试过了,但失败了 提前谢谢 例1: func save(kind string, c.appengine.Context, object interface{}) { k := datas

我正在尝试创建一个用于保存到数据存储的通用函数。下面两个示例中的第二个可以工作,但第一个示例给了我一个“datastore:invalid entity type”错误

目前我对围棋一无所知,但我试图减少我的无知。是否有某种方法可以将第一个示例中的对象强制转换为名称保存在字符串中的类型。例如某种反思。我试过了,但失败了

提前谢谢

例1:

func save(kind string, c.appengine.Context, object interface{}) {
    k := datastore.NewKey(c, kind, "some_key", 0, nil)
    _, err := datastore.Put(c, k, &object)
}
save("MyType", c, someMyTypeObject)
例2:

func save(kind string, c.appengine.Context, object MyType) {
    k := datastore.NewKey(c, kind, "some_key", 0, nil)
    _, err := datastore.Put(c, k, &object)
}
save("MyType", c, someMyTypeObject)

datastore.Put
将结构指针作为其第三个参数,但您将指针传递给的接口在本例中无效

要解决这个问题,您需要在调用
save
时传递一个指针,并将其原样传递到
数据存储。Put

func save(kind string, c appengine.Context, object interface{}) {
    k := datastore.NewKey(c, kind, "some_key", 0, nil)
    _, err := datastore.Put(c, k, object)
}
save("MyType", c, &someMyTypeObject)

您可以将此视为将
someMyTypeObject
传递到
数据存储。通过
save
放置
,而
save
不知道它是什么。

Ref(类似于Java或C中的引用类型强制转换)-请注意在赋值过程中使用时的区别。谢谢,但我仍然不明白。据我所知,第一个datastore.Put失败,因为对象的类型为“interface{}”。因此,我需要将其转换为类型“MyType”(如字符串“kind”中定义的)。看你引用的页面,我看不到任何类似的内容。我胖了吗?谢谢你的耐心。是的,不,不是那样的。不可能使用运行时值来确定编译时/静态类型信息。您必须接受更一般的约定(例如,
接口{}
,但它可以更精细),通过使用某种形式的彻底映射(即类型断言)关闭值,或者对相关调用使用反射。基本上,不能基于值添加静态类型信息。请注意,Go中没有“类型转换”之类的东西:只有“类型转换”。这不是吹毛求疵:Go强调没有隐式类型转换,因此进行任何转换都必须是有意识的决定。谢谢。这正是我所希望的。