我正在学习,并在巡演中遇到这段代码:
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
?
答案 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)