- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我不明白如何正确确保某些东西不是 nil
在这种情况下:
package main
type shower interface {
getWater() []shower
}
type display struct {
SubDisplay *display
}
func (d display) getWater() []shower {
return []shower{display{}, d.SubDisplay}
}
func main() {
// SubDisplay will be initialized with null
s := display{}
// water := []shower{nil}
water := s.getWater()
for _, x := range water {
if x == nil {
panic("everything ok, nil found")
}
//first iteration display{} is not nil and will
//therefore work, on the second iteration
//x is nil, and getWater panics.
x.getWater()
}
}
nil
的唯一方法是通过使用反射。
最佳答案
这里的问题是 shower
是 interface
类型。 Go 中的接口(interface)类型保存实际值及其动态类型。更多详情:The Laws of Reflection #The representation of an interface .
您返回的 slice 包含 2 个非 nil
值。第二个值是一个接口(interface)值,一个 (value;type) 对,包含一个 nil
指针值和 *display
混凝土类型。引自 Go Language Specification: Comparison operators :
Interface values are comparable. Two interface values are equal if they have identical dynamic types and equal dynamic values or if both have value
nil
.
nil
进行比较,它将是
false
.如果将其与代表对
(nil;*display)
的接口(interface)值进行比较,它将是
true
:
if x == (*display)(nil) {
panic("everything ok, nil found")
}
这似乎不可行,因为您必须知道接口(interface)拥有的实际类型。但请注意,您可以使用反射来判断非
nil
接口(interface)值包装了一个
nil
值使用
Value.IsNil()
.你可以在
Go Playground 上看到一个例子。 .
interface
只是一个方法集,如果相同的方法是
method set 的一部分,任何类型都会实现它类型的。有些类型不能是
nil
,例如
struct
或自定义类型
int
作为其基础类型。在这些情况下,您不需要能够存储
nil
该特定类型的值。
nil
是一个有效值(例如 slice 、映射、 channel 、所有指针类型),因此为了在运行时存储满足接口(interface)的值,支持存储
nil
是合理的。界面里面。但除了
nil
在接口(interface)内部,我们必须将其动态类型存储为
nil
value 不携带此类信息。另一种选择是使用
nil
当其中存储的值为
nil
时作为接口(interface)值本身,但这种解决方案是不够的,因为它会丢失动态类型信息。
Some people say that Go's interfaces are dynamically typed, but that is misleading. They are statically typed: a variable of interface type always has the same static type, and even though at run time the value stored in the interface variable may change type, that value will always satisfy the interface.
nil
值
interface
类型,使用显式
nil
值,然后您可以测试
nil
平等。最常见的例子是内置的
error
type 是一种方法的接口(interface)。只要没有错误,就明确设置或返回值
nil
而不是某些具体(非接口(interface))类型错误变量的值(这将是非常糟糕的做法,请参见下面的演示)。
shower
) shower
类型的但具体类型*display
输入
shower
slice,将创建一个接口(interface)值,它是一对 (value;type) 其中 value 是
nil
和类型是
*display
.该对内的值将为
nil
,而不是接口(interface)值本身。如果你想放一个
nil
值进入 slice ,那么接口(interface)值本身就是
nil
和条件
x == nil
将是
true
.
type MyErr string
func (m MyErr) Error() string {
return "big fail"
}
func doSomething(i int) error {
switch i {
default:
return nil // == nil
case 1:
var p *MyErr
return p // != nil
case 2:
return (*MyErr)(nil) // != nil
case 3:
var p *MyErr
return error(p) // != nil because the interface points to a
// nil item but is not nil itself.
case 4:
var err error // == nil: zero value is nil for the interface
return err // This will be true because err is already interface type
}
}
func main() {
for i := 0; i <= 4; i++ {
err := doSomething(i)
fmt.Println(i, err, err == nil)
}
}
输出:
0 <nil> true
1 <nil> false
2 <nil> false
3 <nil> false
4 <nil> true
在情况 2 中
nil
返回指针,但首先将其转换为接口(interface)类型(
error
),因此会创建一个接口(interface)值,其中包含
nil
值和类型
*MyErr
,所以接口(interface)值不是
nil
.
关于pointers - 隐藏 nil 值,理解为什么 golang 在这里失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46520955/
在指向指针的指针上使用指针算术是否定义明确? 例如 int a=some_value; int* p=&a; int**p2=&p; 现在对 p2 执行算术是否是定义明确的行为?(例如 p2+1、p2
我正在尝试使用一个函数来替代 C 中的 scanf()。该函数是由第三方编写的,并进行了相应的定义: ScanDecimal16uNumber - Scans a decimal 16bit unsi
我正在尝试为 Sundials CVODE 编写 CFFI 包装器图书馆。 SWIG 被 Sundial header 阻塞,因为它们相互关联,并且 SWIG 找不到合适的 header ,所以我手工
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: pass by reference not working 我正在阅读一些教程 linklistproblem在互联
我有一个代码片段很难理解。 char *c; // c is uni dimensional table ( single row ) char **p ; // p is a two dimen
我正在将一些代码移植到 Windows 并且被难住了。有一些代码在启动时自动运行以将指针复制到指针,并在退出时再次运行以删除指向指针的指针(如果它不为空)。 我已经创建了一个示例程序来重现该行为 in
将非 const 指针转换为 const 指针是合法的。 那为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0; con
将非 const 指针转换为 const 指针是合法的。 那为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0; con
将指向非常量的指针转换为指向常数的指针是合法的。 那么为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0; const
之间有什么区别 procedure(some_routine), pointer :: ptr ptr => null() 和 procedure(some_routine), pointer ::
只是为了消除一些困惑。我最近遇到了这段代码(使用指针到指针): int encode(unsigned char type, uint64_t input_length, unsigned char*
我已经阅读了我能找到的有关 C/C++ 指针的内容,但其中大部分是介绍性的,虽然它可以帮助您理解它们的使用,但在许多情况下,现有代码会抛出难以破译的示例。 我确实看到了一些例子,他们将一行代码分解成它
我一直在关注的学习数据结构的书使用“单指针”作为函数中的参数,这些函数在链表的不同位置添加新节点,例如在开始,在结束。同样在删除的情况下使用“pointer-to-pointer”。在所有这些情况下,
考虑这段代码: #define MAX 4 ............ ............ int** ptr = (int**)malloc(sizeof(int*)*MAX); *ptr =
如何将指向 void 对象的指针转换为类对象? 最佳答案 使用 static_cast。请注意,只有当指针确实指向指定类型的对象时,您才必须这样做;也就是说,指向 void 的指针的值取自指向此类对象
我假设一种语言的实现允许您将指针视为整数,包括对它们进行标准算术。如果由于硬件限制这是不现实的,请告诉我。如果编程语言通常没有这么强大的指针运算,但是在实践中是可行的,那么我仍然想知道这种实现BigI
我是一名 nodejs 开发人员,我通常为我的应用程序使用一个结构,该结构包含一个配置包/对象,该对象包含对我常用的库和配置选项的引用。通常,此配置对象也包含我的数据库连接,并且可以通过我的应用程序访
我已经在几个上下文中阅读过“胖指针”这个术语,但我不确定它的确切含义以及它何时在 Rust 中使用。指针似乎是普通指针的两倍,但我不明白为什么。它似乎也与特征对象有关。 最佳答案 术语“胖指针”用于指
这是让我困惑的代码。 static char *s[] = {"black", "white", "pink", "violet"}; char **ptr[] = {s+3, s+2, s+1, s
通用指针允许您创建指向指针的指针: void foo(Object **o) {} int main() { Object * o = new Object(); foo(&o); } s
我是一名优秀的程序员,十分优秀!