2016-05-17 30 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。你是對的。專注於獲取部分。我會盡快解決這個問題,因爲我的答案是錯誤的 –