当前位置: 首页 > 知识库问答 >
问题:

在nil结构指针上调用方法不会引起恐慌。为什么不呢?

袁俊弼
2023-03-14
type MyError struct {
    errors []string
}

func (t *MyError) Error() string {
    if t == nil {
        fmt.Println("t ptr empty")
        return ""
    }
    pointers := make([]string, 0, len(t.errors))
    for i, r := range t.errors {
        pointers[i] = r
    }
    sort.Strings(pointers)
    return fmt.Sprintf("n error(s) decoding:\n\n%s", len(t.errors), strings.Join(pointers, ","))
}

func main() {
    var err *MyError
    err.Error()  // expected "panic: runtime error: invalid memory address or nil pointer dereference" here
}

共有1个答案

段干昊然
2023-03-14

迈克尔·琼斯很好地解释了这一点(作为答案复制):

在Go中,由Expression.name()语法调用的函数完全由表达式的类型决定,而不是由该表达式的特定运行时值(包括nil)决定。

通过这种方式,对特定类型的nil指针调用方法具有明确和逻辑的含义。

func (p *Sometype) Somemethod (firstArg int) {} 
func SometypeSomemethod(p *Sometype, firstArg int) {}
 类似资料:
  • 问题内容: 为什么要成功恢复惊慌的goroutine调用,而不能成功调用呢? 作为一个简单的示例,此代码不会出现紧急情况 但是,用直接恢复紧急情况代替匿名功能 问题答案: 该处理恐慌部分提到, 两个内置函数和,可帮助报告和处理运行时紧急情况 该功能允许程序管理恐慌性goroutine的行为。 假设一个函数 推迟了要调用 的函数 ,并且在执行该函数的同一个goroutine上的函数中出现了a 。 当

  • 作为一个极简的示例,此代码并不恐慌 但是,直接用recover替换匿名函数会引起恐慌

  • 问题内容: 我用Java编写了这个程序 我读到在对象上调用方法会导致,但是上面的程序不是吗?为什么是这样?我是否理解不正确? 问题答案: 是一种方法。一个成员所属的类型,并且不需要一个实例来访问。 甲构件应该仅可以经由型表达访问。也就是说,你应该将其编写如下: Java确实允许你通过对象引用表达式访问成员,但这非常容易引起误解,因为这不是成员访问的实际语义。 通过对象引用表达式访问成员时,仅声明的

  • 问题内容: 给定golang巡回演出的第54张幻灯片中的设置: 为什么不能同时为结构体和指向结构体的指针定义方法?那是: 定义此将产生以下错误: 问题答案: 它可以。只需在结构而不是指针上定义它即可。它将解决两种方式 方法集 对应的指针类型 T的方法集是接收者 T或T的所有方法的集(即,它也包含T的方法集) 尝试直播:http://play.golang.org/p/PsNUerVyqp 更新:

  • 问题内容: 这个来自json.Unmarshal docs的示例(为便于使用而不是进行了稍微修改)有效,没有错误: 工作示例的游乐场链接 但是这个经过稍微修改的示例却没有: 非工作示例的游乐场链接 它显示了这个实际上并没有帮助的模糊错误(看起来更像是一个函数调用,而不是错误的IMO): json:Unmarshal(nil * main.Animal) 这似乎是因为它是未初始化的指针。但是文档说(

  • 问题内容: 如果我的结构包含类型为的指针,则用于检查该属性是否会导致,这使我感到奇怪。 具体来说,我将JSON对象编组到一个结构中,在该结构中,我想测试一个特定的属性是当相应的JSON结构不包含该属性时。如果不是要走的路,我应该怎么做? 问题答案: 您传递给的所有内容都包装在一个值中(如果还没有的话): 将比较值,其中第一个参数值 不是,仅包装在其中的值。 接口值表示为一对。您传递给的第一个值是一