Golang检查接口是否为零

时间:2017-11-20 17:28:54

标签: go

我遇到了一段我不太理解的Go代码:

package main

import (
    "io"
)

type MyCloser struct {
    internalImplementation io.Closer
    // other fields here
}

func (c *MyCloser) Close() error {
    return c.internalImplementation.Close()
}

func closeUnlessNil(c io.Closer) {
    if c != nil {
        c.Close()
    }
}

func main() {
    var c *MyCloser // c == nil
    defer closeUnlessNil(c)
}

在此尝试:https://play.golang.org/p/0CA4fTKpMs

在第18行调用c.Close()时,代码会导致分段错误。

我有两个问题:

  1. 这究竟发生了什么? ccloseUnlessNil(io.Closer)的价值是多少?我原以为它nil,但情况显然不是这样。
  2. 是否可以编写适用于任何closeUnlessNil(io.Closer)的通用io.Closer函数,并且仅当参数不是Close()时调用nil

0 个答案:

没有答案