go - 从 Go 编译器获取 "undefined: distance"错误

标签 go

我是一名经验丰富的“守旧派”程序员,但是是 Go 的新手。我正在学习“CreateSpace:介绍 Programming in Go”一书。在第 111 页,第 9 章问题的第三部分,任务是向用户定义的 Shape 接口(interface)添加一个新方法。该接口(interface)是在本章的过程中构建的,下面是我到目前为止:

package main

import (
    "fmt"
    "math"
)

type Shape interface {
    area() float64
    perimeter() float64
}

type Distance struct {
    x1, y1, x2, y2 float64
}

func (d *Distance) distance() float64 {
    a := d.x2 - d.x1
    b := d.y2 - d.y1
    return math.Sqrt(a*a + b*b)
}

type Rectangle struct {
    x1, y1, x2, y2 float64
}

func (r *Rectangle) area() float64 {
    l := distance(r.x1, r.y1, r.x2, r.y1)
    w := distance(r.x1, r.y1, r.x1, r.y2)
    return l * w
}

type Circle struct {
    x, y, r float64
}

func (c *Circle) area() float64 {
    return math.Pi * c.r * c.r
}

type Perimeter struct {
    x1, y1, x2, y2 float64
}

func (p *Perimeter) perimeter() float64 {
    s1 := distance(p.x1, p.y1, p.x1, p.y2)
    s2 := distance(p.x1, p.y2, p.x2, p.y2)
    s3 := distance(p.x2, p.y2, p.x2, p.y1)
    s4 := distance(p.x2, p.y1, p.x1, p.y1)
    return s1 + s2 + s3 + s4
}

func main() {
    d := new(Distance)
    d.x2, d.y2, d.x1, d.y1 = 0, 0, 10, 10

    p := new(Perimeter)
    p.x1, p.y1 = 0, 0
    p.x2, p.y2 = 10, 10
    fmt.Println(p.perimeter())

    r := new(Rectangle)
    r.x1, r.y1 = 0, 0
    r.x2, r.y2 = 10, 10
    fmt.Println(r.area())

    c := Circle{0, 0, 5}
    fmt.Println(c.area())

}

问题是我收到以下错误(来自编译器?):

user@pc /c/Go/src/golang-book/chapter9/chapterProblems
$ go run interface.go
# command-line-arguments
.\interface.go:25: undefined: distance
.\interface.go:26: undefined: distance
.\interface.go:42: undefined: distance
.\interface.go:43: undefined: distance
.\interface.go:44: undefined: distance
.\interface.go:45: undefined: distance

我花了很多时间通过重新阅读章节文本并认真思考这方面的内容来进行“尽职调查” “undefined: distance”错误可能意味着,但到目前为止无济于事。 如您所见,我定义了一个“距离结构”,创建了一个 new() 实例 它调用了 d,用 . 运算符初始化了它的字段,并创建了一个 distance() 函数,但是,很明显,我不是在摸索一些相关的信息。

最佳答案

您没有名为distance 的函数。它是 *Distance 类型的方法。您需要先创建一个*Distance,然后调用该方法。

d := &Distance{r.x1, r.y1, r.x2, r.y1}
l := d.distance()

我建议从 Effective Go 开始.对于“经验丰富的程序员”来说,这是对这门语言的非常好的介绍。

关于go - 从 Go 编译器获取 "undefined: distance"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31163376/

相关文章:

go - 我应该使用 channel 还是 sync.Mutex lock()?

entity-system - ECS with Go - 循环导入

使用不同的键进行 JSON 解码

multithreading - 每个唯一 id 不超过一个并发线程运行代码的算法

具有不同(未知)字符串匹配的正则表达式

golang 如何实时测试一个 http 服务器?

elasticsearch - 如何在 Elastigo 中设置 Content-Type header

azure - ServiceBus Dequeue 触发消息在 azure 中解码 Golang 自定义处理程序 : message format

go - 无法使用来自本地运行的 Kafka 服务器的消息,使用 Golang Sarama 包

docker - 如何使用 Docker 引擎 SDK 和 Golang 运行 docker 安装卷