简体   繁体   中英

method ambiguity when declaring a type in Go

I'm learning go and came across this piece of code on go tour:

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())
}

Here we declare a type named MyFloat and return type is float64. I was thinking that I can declare methods which only returns float64. I declared a method named run() in the above case which returns string. How is this possible? Why can't I just declare the type with no specific return type like this type MyFloat ?

Example in Playground

You are confusing types and methods. As putu already menitioned in a comment, types don't "return" anything. In a kind of handwavy way most types are just data structures that you can attach methods to*.

Another way to write the methods in your example is this:

// 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"
}

Note that the function bodies are no different at all. The difference is just in how you call these functions. Semantically they are equivalent. The receiver of a method becomes the implicit first argument to a function.

[*] This ignores function types, which don't hold data. net/http.HandlerFunc is a prominent example in the standard library.

type HandlerFunc func(ResponseWriter, *Request)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM