相关疑难解决方法(0)

如何将interface {}转换为字符串?

我正在使用docopt来解析命令行参数.这是有效的,它会产生一个地图,例如

map[<host>:www.google.de <port>:80 --help:false --version:false]
Run Code Online (Sandbox Code Playgroud)

现在我想将值hostport值连接到一个字符串,并在两个值之间加上冒号.基本上,如:

host := arguments["<host>"] + ":" + arguments["<port>"]
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为我收到错误消息:

无效操作:arguments [""] +":"(不匹配的类型interface {}和string)

所以显然我需要将我从地图中得到的值(只是interface{},所以它可以是任何东西)转换为字符串.现在我的问题是,我该怎么做?

go

89
推荐指数
3
解决办法
11万
查看次数

回归更专业的界面

我正在写一个游戏.在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

71
推荐指数
2
解决办法
8万
查看次数

类型断言/类型开关是否具有不良性能/在Go中速度慢?

在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)

casting type-conversion go type-assertion

41
推荐指数
4
解决办法
1万
查看次数

在Golang中将[]接口转换为[]字符串

我正在使用github.com/fatih/structs包将结构的所有字段的值转换[]interface{}toValues()函数.看到这里.这很好,但最终我想通过使用csv包将值写入csv文件.该csv.Write()功能需要[]string输入.

简而言之:如何轻松地将输出转换toValues()为字符串数组?

string struct interface go slice

8
推荐指数
1
解决办法
9951
查看次数

golang通过反射从接口获取结构

原始问题:

我正在尝试进行反序列化,并且在传递接口时如何访问结构有些困惑。

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)

reflection go

5
推荐指数
1
解决办法
1万
查看次数

如何在 golang 中实现 void* ?

我正在 Golang 中制作一棵(非二元)树。

在Java中,我会使用类似的东西

 class Node{
   List <Object> data;
 }
Run Code Online (Sandbox Code Playgroud)

其中 data 可以是指向数据或子节点的指针

在 C 或 C++ 中,我会使用 void*。

我应该在 golang 中使用什么类型

go

5
推荐指数
1
解决办法
2万
查看次数

无法在赋值中使用单词(类型接口 {})作为类型字符串:需要类型断言

我是 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]]]

arrays types interface go type-assertion

0
推荐指数
1
解决办法
6914
查看次数