2011-06-22 37 views
4

試圖創建一個接口,但方法有*Type,不Type接收機在go中,如何在* Type調用方法時創建接口?

道歉:困和誤讀的錯誤消息。以爲我在創建數據庫接口時被阻止,實際上我誤用了它。對不起... ...將來會更加小心!

 
type Char string 

func (*Char) toType(v *string) interface{} { 
     if v == nil { 
       return (*Char)(nil) 
     } 
     var s string = *v 
     ch := Char(s[0]) 
     return &ch 
} 
func (v *Char) toRaw() *string { 
     if v == nil { 
       return (*string)(nil) 
     } 
     s := *((*string)(v)) 
     return &s 
} 

從這裏我想包含方法toTypetoRaw

 
type DB interface{ 
     toRaw() *string 
     toType(*string) interface{} 
} 

不起作用,因爲該功能接收器指針的接口。我這樣說是因爲當我嘗試使用它,我得到了error.k

 
    Char does not implement DB (toRaw method requires pointer receiver) 

有沒有一種方法來創建toTypetoRaw的接口,或者我需要備份,並且具有接收器是類型本身而不是指向類型的指針?

+1

不知怎的,這是很難得到你的代碼背後的想法。請提供更多信息。 – Mue

+0

嘗試使用func'toRaw'和'toType'創建數據庫接口。但不能,因爲funcs的接收器是指針。有什麼辦法可以聲明一個包含'toRaw'和'toType'的數據庫接口? –

回答

4

我不明白你的問題是什麼。是的,你寫的方式,*Char符合接口DBChar不符合。您可以

  1. 改變你的代碼,以便這些方法直接對非指針類型Char操作(它會自動也爲*Char工作太)
  2. 只有當你需要的東西要與類型兼容使用*CharDB
+0

問題是它出現我不能使接口是指針的方法的接口。這是真的還是有一些解決方法? –

+0

是的,你是對的 –

5

如果定義爲指針類型的接口方法,你必須通過一個指向方法/函數期待的接口。

+2

「有一個接口,你應該總是傳遞一個指針」這是不正確的。非指針類型可以通過實現必要的方法來符合接口,就像指針類型一樣簡單。 – newacct

+0

你說得對。我將編輯我的帖子。 – Asgeir

+0

這不起作用。 'c:=&char(「foo」)'不是一個有效的語句。你不能拿「foo」的地址。 – peterSO

相關問題