- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
当附加 nil
的 reflect.Value
时,下面的代码将引发运行时错误:
package main
import (
"fmt"
"reflect"
)
func main() {
var list []interface{}
v := reflect.ValueOf(list)
v = reflect.Append(v, reflect.ValueOf(1)) // [1]
v = reflect.Append(v, reflect.ValueOf("1")) // [1, 1]
v = reflect.Append(v, reflect.ValueOf(nil)) // runtime error
fmt.Println(v)
}
所以
reflect.Append
将 nil
添加到 interface{}
slice ?最佳答案
interface{}
是一种接口(interface)类型,它们很“棘手”。它们是具体值和具体类型的包装器,示意性地是一对(值,类型)。
因此,当您将具体值传递给需要 interface{}
值的函数时,具体值将自动、隐式地包装在 interface{}
值中.如果您将 nil
传递给此类函数,则接口(interface)值本身将为 nil
。如果你传递一个nil
指针给它,比如(*int)(nil)
,接口(interface)值就不会是nil
而是一个接口(interface)持有“(nil,* int)”的值(value)。
如果您将 nil
传递给 reflect.ValueOf()
,它会产生一个“零”reflect.Value
,表示在全部。如果您将其传递给 reflect.Append()
,它将没有类型信息,它不知道您要将什么附加到 slice 。
可以创建一个表示 nil
接口(interface)值的值。
为此,我们可以从接口(interface)指针值的类型描述符开始(指向接口(interface)的指针很少有意义,但这就是其中之一)。我们导航到指向类型的类型描述符,即 interface{}
。我们获得该类型的零值(使用 reflect.Zero()
),即 nil
(接口(interface)类型的零值是 nil
)。
Zero returns a Value representing the zero value for the specified type. The result is different from the zero value of the Value struct, which represents no value at all.
这就是它的样子:
typeOfEmptyIface := reflect.TypeOf((*interface{})(nil)).Elem()
valueOfZeroEmptyIface := reflect.Zero(typeOfEmptyIface)
v = reflect.Append(v, valueOfZeroEmptyIface)
或者单行:
v = reflect.Append(v, reflect.Zero(reflect.TypeOf((*interface{})(nil)).Elem()))
要检查结果,让我们使用:
fmt.Printf("%#v\n", v)
同时让我们对 slice 进行类型断言,并使用内置的 append()
函数添加一个 nil
值:
list = v.Interface().([]interface{})
list = append(list, nil)
fmt.Printf("%#v\n", list)
让我们做一个明确的额外检查元素是否为 nil
(将它们与 nil
进行比较)。尽管使用 %#v
动词这是多余的,%v
喜欢打印非 nil
接口(interface)持有 nil
具体值与 nil
一样(就好像接口(interface)值本身是 nil
一样)。
fmt.Println(list[2] == nil, list[3] == nil)
输出将是(在 Go Playground 上尝试):
[]interface {}{1, "1", interface {}(nil)}
[]interface {}{1, "1", interface {}(nil), interface {}(nil)}
true true
参见相关问题:Hiding nil values, understanding why golang fails here
关于go - 如何通过 reflect.Append 将 nil 附加到动态类型 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56396510/
Racket 的 pict , 有几个 combinators for combining other pictures .这些文档包含一个很好的表格,说明其 *-append 组合器的工作方式: 这
我看过 Insert content into iFrame和他们的 fiddle http://jsfiddle.net/8VP4y/3/提出以下我遇到问题的代码。 我已经为下面的问题创建了一个 j
我有一个显示非常奇怪结果的微基准: @BenchmarkMode(Mode.Throughput) @Fork(1) @State(Scope.Thread) @Warmup(iterations =
我想知道是否有人可以回答我使用 StringBuilder 对象在 java 中执行这些语句中的哪一个会更好: 使用 .append(string1 + string 2) 对比 .append(st
假设我有两个相同类型的流。是否可以将一个流 append 到另一个流而无需事先将它们转换为列表? 例子: Stream ms = ...; Stream ns = ...; return ms.app
我有以下有效的 jQuery 代码,但它让我思考是否可以对正在 append 的内容执行 append 操作,而无需指定我想要 append 的内容。 append().append() 并没有达到目
这是为了显示诊断页面的检查。我有一个 .append(not_ok) 但当 swf 文件加载 100% 时,我想删除 not_ok 附加,然后添加一个 .append(ok)。 function ca
x = [[1,2],[2,3],[10,1],[10,10]] def duplicatingRows(x, l): severity = x[l][1] if severity =
我有一个列表,我正在尝试将数据注入(inject)其中。列表如下所示 data2 = ['TECH2_HELP', 'TECH2_1507', 'TECH2_1189', 'TECH2_4081',
为了有效地进行一些 DOM 操作,我分离了一个元素。在这个过程中,我遇到了一个有趣的情况: var $holder = $("#d"); var $wrapper = $("").css("borde
我遇到了图片在移动设备上加载速度不够快的问题。我的元素有一个图像和一个按钮。单击该按钮时,图像向下滑动,另一幅图像从顶部滑动以取代它。这是代码 html CSS .moveF
我正在编写一个包含 10 个遗愿 list 的简单哈希表。使用内置的 hash() 计算索引,然后对表大小取模。但是,当我尝试将该对象 append 到该索引处的存储桶列表时,它会 append 到每
我是 LISP 的新手,我正在尝试处理类的 cond 语句。目前,我正在尝试检查传递的值是否为列表,如果是,则将字母 d append 到列表中。 这是我的代码: (defun test(L) (li
我正在使用 Jquery 将数据 append 到 div。但是,append 语句之后页面上没有显示任何内容。 我尝试使用 $(window).load 来确保页面已加载,但这仍然不起作用。 HTM
我有以下代码; function SetupDropdowns() { var PrevType; dropdown1 = document.getElemen
我想在 smarty 中创建一个数组并在其中执行 append 功能!就像我在 smarty 模板中声明一个变量(如 {assign var=sizearr value=''} )然后我想在循环中向其
请考虑以下代码片段: var ul = $(".list_b").find("li").remove().end(); $.each(Sites, functi
我的日志记录配置中有两个 appenders。其中之一在 ERROR 事件上发送电子邮件。 一个类,我无法控制,垃圾邮件 ERROR 消息。所以我仍然想要那些消息,但不是在两个 appenders 中
我正在尝试制作 editText,我要在其中插入一些文本。在每三个字符之后,我想插入破折号。 例子: 类型:123 结果:123- 现在当光标在破折号后面并且你按下删除键时,我想删除破折号和破折号
当我尝试 append 简单的“hello”时,它会被 append ,但很快就会自动删除。仅当我在下面给出的表单中使用它时,才会出现此问题,如果删除该表单,则不会出现问题,并且 hello 会正确
我是一名优秀的程序员,十分优秀!