我正在使用docopt来解析命令行参数.这是有效的,它会产生一个地图,例如
map[<host>:www.google.de <port>:80 --help:false --version:false]
Run Code Online (Sandbox Code Playgroud)
现在我想将值host和port值连接到一个字符串,并在两个值之间加上冒号.基本上,如:
host := arguments["<host>"] + ":" + arguments["<port>"]
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为我收到错误消息:
无效操作:arguments [""] +":"(不匹配的类型interface {}和string)
所以显然我需要将我从地图中得到的值(只是interface{},所以它可以是任何东西)转换为字符串.现在我的问题是,我该怎么做?
我正在写一个游戏.在C++中,我将所有实体类存储在BaseEntity类的数组中.如果一个实体需要在世界中移动,那么它将是一个PhysEntity,它源自BaseEntity,但是添加了方法.我试图模仿这是去:
package main
type Entity interface {
a() string
}
type PhysEntity interface {
Entity
b() string
}
type BaseEntity struct { }
func (e *BaseEntity) a() string { return "Hello " }
type BasePhysEntity struct { BaseEntity }
func (e *BasePhysEntity) b() string { return " World!" }
func main() {
physEnt := PhysEntity(new(BasePhysEntity))
entity := Entity(physEnt)
print(entity.a())
original := PhysEntity(entity)
// ERROR on line above: cannot convert physEnt (type PhysEntity) to type Entity:
println(original.b())
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为它不能告诉'实体'是一个PhysEntity.什么是这种方法的合适替代品?
在Go中使用类型断言/类型开关有多慢,作为运行时类型发现的方法?
我听说在C/C++中,例如,在运行时发现类型的性能很差.为了绕过它,通常会将类型成员添加到类中,因此您可以与这些成员进行比较而不是强制转换.
我没有在整个www中找到明确的答案.
这是我要问的一个例子 - 与其他类型检查方法(如上所述,或其他我不知道的)相比,这被认为是快速的吗?
func question(anything interface{}) {
switch v := anything.(type) {
case string:
fmt.Println(v)
case int32, int64:
fmt.Println(v)
case SomeCustomType:
fmt.Println(v)
default:
fmt.Println("unknown")
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用github.com/fatih/structs包将结构的所有字段的值转换[]interface{}为toValues()函数.看到这里.这很好,但最终我想通过使用csv包将值写入csv文件.该csv.Write()功能需要[]string输入.
简而言之:如何轻松地将输出转换toValues()为字符串数组?
原始问题:
我正在尝试进行反序列化,并且在传递接口时如何访问结构有些困惑。
package main
import (
"fmt"
"reflect"
)
type Robot struct {
Id int
}
func f(i interface{}) {
v := reflect.ValueOf(i).Elem().FieldByName("Id")
fmt.Println("fields: ", reflect.ValueOf(i).Elem().NumField())
ptr := v.Addr().Interface().(*int)
*ptr = 100
}
func main() {
robot := Robot{}
var iface interface{} = robot // if I omit this line and pass in robot this works
f(&iface)
fmt.Println(robot.Id) //I want to get here 100
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/y6UN3KZxRB
如果您只是直接传递结构,则play示例会起作用,但是,可以传递实现特定接口的任何内容(在我的示例中,我只是使用空接口)。但是我无法弄清楚如何将其视为底层结构。
更新:
package main
import (
"fmt"
"reflect"
)
type MessageOne struct {
Header …Run Code Online (Sandbox Code Playgroud) 我正在 Golang 中制作一棵(非二元)树。
在Java中,我会使用类似的东西
class Node{
List <Object> data;
}
Run Code Online (Sandbox Code Playgroud)
其中 data 可以是指向数据或子节点的指针
在 C 或 C++ 中,我会使用 void*。
我应该在 golang 中使用什么类型
我是 Go 新手,由于某种原因我所做的事情对我来说似乎不太直接。
这是我的代码:
for _, column := range resp.Values {
for _, word := range column {
s := make([]string, 1)
s[0] = word
fmt.Print(s, "\n")
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Cannot use word (type interface {}) as type string in assignment: need type assertion
resp.Values是一个数组的数组,所有数组都填充有字符串。
reflect.TypeOf(resp.Values)返回[][]interface {},
reflect.TypeOf(resp.Values[0])(即column)返回[]interface {},
reflect.TypeOf(resp.Values[0][0])(即word)返回string。
我的最终目标是让每个单词都有自己的数组,所以不要:
[[Hello, Stack], [Overflow, Team]], 我会:
[[[Hello], [Stack]], [[Overflow], [Team]]]