2016-05-17 69 views
-4

SEE: //定义的方法 “获得()UINT64” 为价值二进制 FUNC(我二进制)GET(){UINT64回报 UINT64(I) }谁在为类型转换定义Get()方法? Golang本身?

我们定义了一个get()方法和显然b:=二进制(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 
} 
+5

“我还没有找到Get()被定义在哪里” - 但是你可以定义它。它就在那里,在说'定义一个方法'的评论下,获取()uint64“作为值Binary'。你为什么困惑? – user2357112

+2

'Binary(200)'不会调用'Get',这是类型转换,因为'Binary'是'uint64'的别名。 'Stringer(b)'不会调用任何东西,这是自''Binary'实现'Stringer'接口以来的类型转换。 – creker

回答

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方法中。

为了进一步阐明,Get方法正在被String()方法所利用,这种类型需要满足Stringer接口的要求。当你使用一个使用Stringer的函数或方法时,这就是String()和Get()被调用的地方。如果这仍然是错误的,请尽快让我知道

+2

不,它不。 'fmt.Println(Binary(200))'调用Binary.String方法,并打印'11001000' – JimB

+0

Doh。你是对的。专注于获取部分。我会尽快解决这个问题,因为我的答案是错误的 –