在Go中声明类型时的方法歧义

时间:2017-10-11 05:53:39

标签: go

我正在学习,并在巡演中遇到这段代码:

package main

import (
    "fmt"
    "math"
)

type MyFloat int

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

func (f MyFloat) run() string{
    fmt.Println("This is called")
    return "Hey there"
    }

func main() {
    f := MyFloat(-math.Sqrt2)
    fmt.Println(f.Abs())
    fmt.Println(f.run())
}

这里我们声明一个名为MyFloat的类型,返回类型是float64。我在想我可以声明只返回float64的方法。我在上面的例子中声明了一个名为run()的方法,它返回字符串。这怎么可能?为什么我不能声明没有特定返回类型的类型,例如type MyFloat

Example in Playground

1 个答案:

答案 0 :(得分:1)

您的类型和方法令人困惑。由于putu已经在评论中提到过,所以类型不会“返回”任何东西。以一种手工方式,大多数类型只是数据结构,您可以将方法附加到*。

在您的示例中编写方法的另一种方法是:

// func (f MyFloat) Abs() float64 {
func Abs(f MyFloat) float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

// func (f MyFloat) run() string {
func run(f MyFloat) string {
    fmt.Println("This is called")
    return "Hey there"
}

请注意,函数体完全没有区别。不同之处仅在于您如何调用这些功能。在语义上它们是等价的。方法的接收者成为函数的隐式第一个参数。

[*]这会忽略不保存数据的函数类型。 net / http.HandlerFunc是标准库中的一个突出示例。

type HandlerFunc func(ResponseWriter, *Request)