谁在为类型转换定义Get()方法? Golang本身?

时间:2016-05-17 20:53:10

标签: go

请参阅:     //定义一个方法" Get()uint64"价值二进制     func(i Binary)Get()uint64 {     返回uint64(i)     }

我们定义了一个方法Get(),显然 b:= Binary(200)执行它, 但那时之间的联系在哪里。我还没有找到定义Get()的地方,我认为这个定义覆盖了内部定义,或者我错了。

package main

import (
    "fmt"
    "strconv"
)

// This defines a interface with one method: "String() string"
type Stringer interface {
    String() string
}

// Defines an unsigned 64 bit number
type Binary uint64

// Defines a method "String() string" for value Binary
func (i Binary) String() string {
    return strconv.FormatUint(i.Get(), 2)
}

// Defines a method "Get() uint64" for value Binary
func (i Binary) Get() uint64 {
    return uint64(i)
}

// Main program
func main() {
    b := Binary(200) // Create Unsigned value of 200

    s := Stringer(b) // Calls interface "Stringer" on "b"

    fmt.Println(s.String()) // "s" is an Stringer Interface Type
}

1 个答案:

答案 0 :(得分:0)

实际上,您已经为uint64创建了一个别名,因此当您转换数字200时,它的原始值仍然是uint64,但您的自定义二进制类型允许您使用您可以在自定义类型上定义的方法来修改它。

在你投射时没有调用Get()方法,你只是告诉Go运行时将其视为二进制类型而不是基础uint64。实际上,Get()方法实际上是多余的,因为你可以将它传递给它,好像它是一个uint64并且你没有用于满足stringer接口的String()方法,如果原始值将打印出来,如果你做了fmt.Println(b)

fmt.Println(200) //prints 200
fmt.Println(Binary(200)) // also prints 200

正如JimB所说,这不会发生在定义的String方法上。

为了进一步说明,String方法正在使用Get方法,这种类型需要满足Stringer接口要求。当您使用一个使用Stringer的函数或方法时,这就是调用String()和Get()的地方。如果这仍然是错误的,请在评论中尽快了解