我很难理解如何设置已作为指针传递的接口值。我正在努力实现以下目标:
import "fmt"
var Stuff map[string]interface{}
func main() {
var num int
Stuff["key"] = 9001
get("key", &num)
fmt.Println("num:", num)
}
func get(k string, v interface{}) {
*v = Stuff[k]
}
我要做什么才能使程序输出为
num: 9001
编辑:是否有可能使用所有解决方案reflect
?
您可以使用来模拟AppEngine数据存储接口reflect
。通常,我说的是最小化反射,但是您(以及AppEngine和其他ORM)在这里没有其他很好的选择来展示您想要的接口。对于模仿Get
您的内容:
reflect.Value
与ValueOf()
reflect.Zero
reflect.Field()
,填充一些数据。reflect.Indirect()
和Value.Set()
通过指针设置原稿。一个仅通过指针将结构归零的简单示例位于http://play.golang.org/p/g7dNlrG_vr,并在此处复制:
package main
import (
"fmt"
"reflect"
)
func main() {
i := 1
clear(&i)
fmt.Println(i)
}
func clear(dst interface{}) {
// ValueOf to enter reflect-land
dstPtrValue := reflect.ValueOf(dst)
// need the type to create a value
dstPtrType := dstPtrValue.Type()
// *T -> T, crashes if not a ptr
dstType := dstPtrType.Elem()
// the *dst in *dst = zero
dstValue := reflect.Indirect(dstPtrValue)
// the zero in *dst = zero
zeroValue := reflect.Zero(dstType)
// the = in *dst = 0
dstValue.Set(zeroValue)
}
为了进行仿真,GetMulti
您需要更多的步骤来使用切片。一个示例在http://play.golang.org/p/G_6jit2t-2及以下:
package main
import (
"fmt"
"reflect"
)
func main() {
s := []int{}
getMultiZeroes(&s, 10)
fmt.Println(s)
}
func getMultiZeroes(slicePtrIface interface{}, howMany int) {
// enter `reflect`-land
slicePtrValue := reflect.ValueOf(slicePtrIface)
// get the type
slicePtrType := slicePtrValue.Type()
// navigate from `*[]T` to `T`
sliceElemType := slicePtrType.Elem().Elem() // crashes if input type not `*[]T`
// we'll need this to Append() to
sliceValue := reflect.Indirect(slicePtrValue)
// and this to Append()
sliceElemValue := reflect.Zero(sliceElemType)
// append requested number of zeroes
for i := 0; i < howMany; i++ {
// s := append(s, v)
sliceValue.Set(reflect.Append(sliceValue, sliceElemValue))
}
}
在实时代码中(相对于像您那样进行测试),使用类型开关(如Martin所建议的)会更快,以便为每种类型运行专用的本机代码。如果您在类型上有不同的行为,那也可能会很方便。为一个例子GetMulti
是在http://play.golang.org/p/q-9WyUqv6P及以下:
package main
import "fmt"
func main() {
s := []int{}
getZeroes(&s)
fmt.Println(s)
fails := []float32{}
getZeroes(&fails)
}
func getZeroes(slicePtrIface interface{}) {
switch sp := slicePtrIface.(type) {
case *[]int:
(*sp) = append((*sp), 0, 0)
case *[]string:
(*sp) = append((*sp), "", "")
default:
panic(fmt.Sprintf("getZeroes: passed type %T, which is not a pointer to a slice of a supported type", slicePtrIface))
}
}
您甚至可以将两者微不足道地结合起来。为常见类型编写自定义代码,并reflect
在默认情况下调用慢速版本。在http://play.golang.org/p/6qw52B7eC3上进行演示(不进行复制,因为这是将上述两者结合在一起的简单方法)。
碰巧还有一个最近的问题],那就是如何使一个值传递给GetMulti
,而不是模仿GetMulti
自身,如果出现的话。
除了回答这个问题以外,更多的是一般参考
“缺乏通过引用传递”是有用的知识,但也需要一些阐述。Go具有指针,以及其他类型,例如包含指向数据的指针的切片。其中有没有意义“通过引用传递”仅仅是围棋永远不会改变的值参数(int
,struct
)为指针含蓄。C
参考参数完全做到了这一点:C
在调用方中void f(i int&) { i++; }
发生更改i
,而调用方没有在调用站点上显式传递指针。func (i int) { i++ }
不。
在Go中,您可以查看传递给函数调用的类型,并告诉它可以更改哪些数据。使用C ++参考参数或某些语言的“按引用传递”语义, 任何
调用都可能会更改本地变量。您不能不查找声明就知道。
为了避免不必要的数据复制,在slice,字符串,映射,接口和通道值的实现中已经有指针。在这些类型中,指针,切片和映射实际上将允许您通过它们修改数据。同样,像在C
++中一样,Go的this
-like接收器参数可以是一个指针,而&
调用代码中没有明确的指示。在Russ
Cox的godata帖子中。
我创建了一个控制器,根据加密的GET参数手动设置安全令牌。我使用它来创建一个远程登录URL,当用户遵循此链接时,该URL将执行登录。 现在我想添加区域设置。当提供了朗参数时,它应该设置区域设置。我添加了这个到我的控制器: 正在根据开发栏将_locale变量设置到设置中。但是,未加载语言文件,它将返回默认语言。 我读过关于创建监听器来实现这一点的文章,但是在我看来,当你想在网址中提供语言时,这是有用
我试图使用SWIG,以便在Android上使用Spotify API(libspotify):https://developer.spotify.com/technologies/libspotify/ 我在定义SWIG接口文件以成功调用以下本机C函数时遇到问题: 在C语言中被称为: 但在Java中,我需要这样称呼它: sp_会话是一个不透明的结构,仅在libspotify的API中定义。h文件格
进入项目页,可以看到项目下的所有接口,需要注意的是,YApi有 接口集合 和 测试集合 两个概念。 接口集合 将接口进行分类,使接口结构更清晰,一个接口只能属于一个集合,且不允许与其他接口重名。 测试集合 为了方便我们测试接口,测试集合 将若干接口组合在一起,在这里一个接口可以属于不同集合。 接口配置 新建接口 后,点击新添加的接口,右侧可以看到接口的预览信息,点击右侧的 编辑 Tab项进入编辑面
我需要设置一个节点的特定属性作为该节点的显示名称。 我正在从下面的列表中选择指定属性(箭头指向的位置),作为节点和关系的显示。 我也想通过密码来做同样的事情。 对于这个n,我想设置ip作为显示名称。
本文向大家介绍JavaScript 通过引用或值传递参数,包括了JavaScript 通过引用或值传递参数的使用技巧和注意事项,需要的朋友参考一下 示例 在JavaScript中,所有参数均按值传递。当函数将新值分配给参数变量时,该更改将对调用者不可见: 但是,对此类参数的(嵌套)属性所做的更改对调用者将是可见的: 这可以看作是通过引用进行的调用:尽管函数无法通过为其分配新值来更改调用者的对象,但
问题内容: 假设我想定义一个接口,该接口代表对远程服务的调用。现在,对远程服务的调用通常会返回一些信息,但也可能包含输入参数。假设一个实现类通常只实现一个服务方法。鉴于上述信息,以下是一个较差的设计(感觉不太正确): 现在,让我们用一个类执行该接口,该类使用输入参数执行远程服务: 关于上述问题,我有两个问题: 如果要提供需要不同输入参数和接口方法返回类型的子类,则使用通用接口()是否合适? 我该如