登录
首页 >  Golang >  Go问答

我可以键入断言一部分接口值吗?

来源:Golang技术栈

时间:2023-04-26 10:11:10 205浏览 收藏

积累知识,胜过积蓄金银!毕竟在##column_title##开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《我可以键入断言一部分接口值吗?》,就带大家讲解一下golang知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我正在尝试从 a 键入 assert[]Node[]Symbol. 在我的代码中,Symbol实现了Node接口。

这是一些周围的代码:

 43 func applyLambda(args []Node, env Env) Node {
 44     if len(args) > 2 {
 45         panic("invalid argument count")
 46     }
 47     fixed, rest := parseFormals(args.([]Symbol))
 48     return Func{
 49         Body: args[1],
 50         FixedVarNames: fixed,
 51         RestVarName: rest,
 52     }
 53 }

这是我得到的错误:

./builtins.go:47: invalid type assertion: args.([]Symbol) (non-interface type []Node on left)

我确信这是有充分理由的。最好的方法是什么?

正确答案

x.(T)变量x应该是接口类型的,因为只对接口类型的变量来说动态类型是不固定的。虽然Node是一个接口,[]Node但不是。切片是一种独特的非接口类型。因此,假设一部分接口值也是一个接口是没有意义的。

类型Node在您的代码中有明确的定义,因此是一个接口。您已经为其指定了方法列表。类型[]Node不是这样的。它定义了哪些方法?

我明白你是从哪里来的。这可能是一个有用的捷径,但没有任何意义。这有点像期望syms.Method()syms' 类型为 '[]Symbol和'Method为' 时工作Symbol

用此代码替换第 47 行可以满足您的要求:

symbols := make([]Symbol, len(args))
for i, arg := range args { symbols[i] = arg.(Symbol) }
fixed, rest := parseFormals(symbols)

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表