gpt4 book ai didi

go - 向 chan 发送了一个 nil 指针,但收到了 "non-nil"

转载 作者:IT老高 更新时间:2023-10-28 13:10:10 25 4
gpt4 key购买 nike

package main

import (
"fmt"
"os/exec"
)

func main() {
errChan := make(chan error)
go func() {
var e *exec.Error = nil
errChan <- e
}()
err := <-errChan
if err != nil {
fmt.Printf("err != nil, but err = %v\n", err)
}
}

输出很奇怪:err != nil, but err = <nil>在这里试试:http://play.golang.org/p/_iyh0m7O1a

最佳答案

问题在于作为错误接口(interface)传入 channel 的值不是nil,而是一个指向nil的exec.Error指针。

如果您进行更改,程序将正常运行:

go func() {
var e *exec.Error = nil
if e == nil {
errChan <- nil
}
}()

这是解决问题的合适方法,因为报告未发生错误的惯用方法是传递一个 nil 错误接口(interface)。

但是,如果您想更改 main 代替(可能是因为您使用了第三方包,这会导致返回指针设置为 nil 的错误),您将不得不对特定类型进行类型断言(*exec .Error),然后检查是否为nil,否则使用反射包。

使用反射检查 nil 的示例:

func IsNil(i interface{}) bool {
// Check if it is an actual nil-value
if i == nil {
return true
}

v := reflect.ValueOf(i)
switch v.Kind() {
// Only the following kinds can be nil
case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
return v.IsNil()
}

return false
}

工作示例:http://play.golang.org/p/rpG1PVTwwM

您可以在这里找到有关它的讨论:https://groups.google.com/forum/#!topic/golang-nuts/QzVDKv7p0Vs

关于go - 向 chan 发送了一个 nil 指针,但收到了 "non-nil",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19316963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com