Pointers 检查指针是否指向零片

Pointers 检查指针是否指向零片,pointers,go,null,slice,Pointers,Go,Null,Slice,我有一个函数,它接受指向任何片的指针,并且所述参数的类型为interface{} 我需要确保指针不指向nil切片 package main import ( "fmt" ) type Dog struct { Name string Age int } func main() { var slicePointer interface{} // We only want slices that were initialized with `make

我有一个函数,它接受指向任何片的指针,并且所述参数的类型为
interface{}

我需要确保指针不指向
nil
切片

package main

import (
    "fmt"
)

type Dog struct {
    Name string
    Age  int
}

func main() {
    var slicePointer interface{}

    // We only want slices that were initialized with `make()`.
    dogs1 := make([]Dog, 0)
    fmt.Println("dogs1 == nil:", dogs1 == nil)

    slicePointer = &dogs1
    fmt.Println("slicePointer == nil:", slicePointer == nil)

    fmt.Println("-----")

    // This needs to be caught, as the slice is `nil`.
    var dogs2 []Dog
    fmt.Println("dogs2 == nil:", dogs2 == nil)

    slicePointer = &dogs2
    fmt.Println("slicePointer == nil:", slicePointer == nil)
}
输出:

dogs1 == nil: false
slicePointer == nil: false
-----
dogs2 == nil: true
slicePointer == nil: false   

有没有办法在Golang中执行这种检查?

您可以通过反射判断非nil接口是否具有nil指针值:

fmt.Println(reflect.ValueOf(slicePointer).Elem().IsNil())
对于最安全的方法:

  if slicePointer!=nil {
    v:=reflect.ValueOf(slicePointer)
    if v.Kind()==reflect.Ptr {
      fmt.Println(v.Elem().IsNil())
    }
  }

您可以使用反射判断非nil接口是否具有nil指针值:

fmt.Println(reflect.ValueOf(slicePointer).Elem().IsNil())
对于最安全的方法:

  if slicePointer!=nil {
    v:=reflect.ValueOf(slicePointer)
    if v.Kind()==reflect.Ptr {
      fmt.Println(v.Elem().IsNil())
    }
  }

这正是我要找的!非常感谢。请注意:在使用reflect时,应该检查值的
Kind()
,否则它会死机。@leadbebebop correct。我在回答中也提到了这一点。请注意,虽然你可以做到这一点,但你几乎肯定不应该做到。这个问题是针对@FloatingSunfish的:如果指针不是nil,你打算用它做什么?显示实际代码。它以:
p:=slicePointer.([]Dog)
开头,不是吗?现在将
如果p==nil
添加到该代码中,并回答第二个问题:当
如果p==nil
如此简单时,为什么要首先进行所有复杂的
反射测试?有一两种情况下,第二个问题的答案令人满意,首先是:“我计划在另一个函数中编写
p:=…
赋值,这样的函数将有几十个,如果p==nil
测试在前面,我不希望每个函数都需要
。“这是令人满意的,因为它提供了一个很好的理由,可以在早期的函数中进行泛型测试,但它仍然有点弱,因为
if p==nil
不是一个复杂的测试,而reflect测试非常复杂。这正是我想要的!非常感谢。请注意:在使用reflect时,应该检查值的
Kind()
,否则它会死机。@leadbebebop correct。我在回答中也提到了这一点。请注意,虽然你可以做到这一点,但你几乎肯定不应该做到。这个问题是针对@FloatingSunfish的:如果指针不是nil,你打算用它做什么?显示实际代码。它以:
p:=slicePointer.([]Dog)
开头,不是吗?现在将
如果p==nil
添加到该代码中,并回答第二个问题:当
如果p==nil
如此简单时,为什么要首先进行所有复杂的
反射测试?有一两种情况下,第二个问题的答案令人满意,首先是:“我计划在另一个函数中编写
p:=…
赋值,这样的函数将有几十个,如果p==nil
测试在前面,我不希望每个函数都需要
。“这是令人满意的,因为它为早期函数中的泛型测试提供了一个很好的理由,但它仍然有点弱,因为
如果p==nil
不是一个复杂的测试,而反射测试非常复杂。