【问题标题】:What is wrong with this following code which throw pointer error下面这个抛出指针错误的代码有什么问题
【发布时间】:2021-09-12 04:23:23
【问题描述】:

谁能告诉我这段代码有什么问题?

package main

import "fmt"

type Document struct{
    testString string
}

type Printer interface{
    Print(d *Document)
}

type Scanner interface{
    Scan(d *Document)
}

type MultiFunctionMachine struct{
     printer Printer
     scanner Scanner    
}

func (m *MultiFunctionMachine)Print(d *Document){       
    m.printer.Print(d)
}

func main(){
    doc:= Document{"test"}      
    multiMachine:= MultiFunctionMachine{}
    multiMachine.Print(&doc)
}

我不明白为什么它一直抛出这个以下错误。指针好像有问题。

*panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1092b46]

     goroutine 1 [running]:
main.(*MultiFunctionMachine).Print(...)
    /Users/dmml/Documents/golang/udemyGoCourses/designPatternInGo/solidDesignPrinciples/interfaceSegrationPrinciple/main.go:85
main.main()
    /Users/dmml/Documents/golang/udemyGoCourses/designPatternInGo/solidDesignPrinciples/interfaceSegrationPrinciple/main.go:94 +0x46
exit status 2*

【问题讨论】:

  • m.printernil 因为你还没有初始化它。
  • 您期望MultiFunctionMachine{} 做什么?您是否希望它自动将所有结构的字段初始化为非zero 值?如果是这样,那么,正如您现在所知道的,这不是 Go 中的工作方式。

标签: go glide-golang


【解决方案1】:

您的 MultiFunctionMachine 结构需要使用它所拥有的 Printer 和 Scanner 接口的具体实现来初始化。换句话说,您需要定义一种或两种类型(结构或其他)来实现 Scan(d *Document) 和 Print(d *Document) 接口(即具有与这些接口相同的签名的函数)。然后将这些具体类型分配给 MultiFunctionMachine 中的接口字段。只有这样才能使用 m:MultiFunctionMachine。由于这些字段未以这种方式初始化,因此您将收到一个 nil 指针取消引用错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多