英文:
Cannot type switch on non-interface value
问题
我正在使用以下虚拟代码进行类型断言的测试,并且遇到了错误:
> 无法对非接口值进行类型切换
有人知道这是什么意思吗?
package main
import "fmt"
import "strconv"
type Stringer interface {
String() string
}
type Number struct {
v int
}
func (number *Number) String() string {
return strconv.Itoa(number.v)
}
func main() {
n := &Number{1}
switch v := n.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
链接:http://play.golang.org/p/Ti4FG0m1mc
英文:
I am playing with type assertion using the following dummy code, and I got the error:
> cannot type switch on non-interface value
Does anyone know what does that mean?
package main
import "fmt"
import "strconv"
type Stringer interface {
String() string
}
type Number struct {
v int
}
func (number *Number) String() string {
return strconv.Itoa(number.v)
}
func main() {
n := &Number{1}
switch v := n.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
答案1
得分: 79
我找到了答案,就是在类型断言之前将 n
转换为 interface{}
:
switch v := interface{}(n).(type)
英文:
I figured out the answer, which is to cast n
to interface{}
before the type assertion:
switch v := interface{}(n).(type)
答案2
得分: 39
类型切换需要一个接口来进行内省。如果你将一个已知类型的值传递给它,它会出错。如果你创建一个接受接口作为参数的函数,它将正常工作:
func typeSwitch(tst interface{}) {
switch v := tst.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
在这里可以查看完整的代码:http://play.golang.org/p/QNyf0eG71_,以及关于接口的Go语言文档:http://golang.org/doc/effective_go.html#interfaces。
英文:
Type switches require an interface to introspect. If you are passing a value of known type to it it bombs out. If you make a function that accepts an interface as a parameter, it will work:
func typeSwitch(tst interface{}) {
switch v := tst.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
See the full code here http://play.golang.org/p/QNyf0eG71_ and the golang documentation on interfaces http://golang.org/doc/effective_go.html#interfaces.
答案3
得分: 2
有两种类型转换:
-
基本数据类型之间的转换。对于这种情况,我们可以使用直接转换。
i := 48
str := string(i)
-
但是使用 value.(type) 进行类型转换是用于在类层次结构之间进行转换的(例如,我们想要从接口中获取特定的实现)。否则,会出现上述错误。
英文:
There are two kinds of type conversions
-
conversion between basic data types. For this we can use the direct casting
i := 48
str := string(i)
-
But type conversion using value.(type) is for conversion among the class hierarchy, (e.g. where we want to get the specific implementation from the interface). Else, we get the above error.
答案4
得分: 0
在Go语言中没有类型转换,你正在进行类型转换操作。
英文:
There are no typecasts in Go. You are doing a type conversion.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论