// 這個範例程式展示如何將一個型別嵌入另一個型別,以及 // 內部型別和外部型別之間的關係 package main import ( "fmt" ) // user 在程式裡定義一個使用者型別 type user struct { name string email string } // notify 實現了一個可以通過user 型別值的指標 // 呼叫的方法 func (u *user) notify() { fmt.Printf("Sending user email to %s<%s>n", u.name, u.email) } // admin 代表一個擁有許可權的管理員使用者 type admin struct { user // 嵌入型別 level string } // main 是應用程式的入口 func main() { // 建立一個admin 使用者 ad := admin{ user: user{ name: "john smith", email: "[email protected]", }, level: "super", } // 我們可以直接存取內部型別的方法 ad.user.notify() // 內部型別的方法也被提升到外部型別 ad.notify() }在上面程式碼中,我們的程式演示了如何嵌入一個型別,並存取嵌入型別的識別符號。我們從第 10 行和第 24 行中的兩個結構型別的宣告開始。在第 10 行,我們宣告了一個名為 user 的結構型別。在第 24 行,我們宣告了另一個名為 admin 的結構型別。在宣告 admin 型別的第 25 行,我們將 user 型別嵌入 admin 型別裡。
// 這個範例程式展示如何將嵌入型別應用於介面 package main import ( "fmt" ) // notifier 是一個定義了 // 通知類行為的介面 type notifier interface { notify() } // user 在程式裡定義一個使用者型別 type user struct { name string email string } // 通過 user 型別值的指標 // 呼叫的方法 func (u *user) notify() { fmt.Printf("Sending user email to %s<%s>n", u.name, u.email) } // admin 代表一個擁有許可權的管理員使用者 type admin struct { user level string } // main 是應用程式的入口 func main() { // 建立一個 admin 使用者 ad := admin{ user: user{ name: "john smith", email: "[email protected]", }, level: "super", } // 給 admin 使用者傳送一個通知 // 用於實現介面的內部型別的方法,被提升到 // 外部型別 sendNotification(&ad) } // sendNotification 接受一個實現了notifier 介面的值 // 並行送通知 func sendNotification(n notifier) { n.notify() }上面程式碼所示的範例程式的大部分和之前的程式相同,只有一些小變化,在程式碼的第 8 行,宣告了一個 notifier 介面。之後在第 53 行,有一個 sendNotification 函數,接受 notifier 型別的介面的值。從程式碼可以知道,user 型別之前宣告了名為 notify 的方法,該方法使用指標接收者實現了 notifier 介面。
Sending user email to john smith<[email protected]>
可以看到程式碼中內部型別的實現被呼叫了。// 這個範例程式展示當內部型別和外部型別要 // 實現同一個介面時的做法 package main import ( "fmt" ) // notifier 是一個定義了 // 通知類行為的介面 type notifier interface { notify() } // user 在程式裡定義一個使用者型別 type user struct { name string email string } // 通過user 型別值的指標 // 呼叫的方法 func (u *user) notify() { fmt.Printf("Sending user email to %s<%s>n", u.name, u.email) } // admin 代表一個擁有許可權的管理員使用者 type admin struct { user level string } // 通過 admin 型別值的指標 // 呼叫的方法 func (a *admin) notify() { fmt.Printf("Sending admin email to %s<%s>n", a.name, a.email) } // main 是應用程式的入口 func main() { // 建立一個 admin 使用者 ad := admin{ user: user{ name: "john smith", email: "[email protected]", }, level: "super", } // 給admin 使用者傳送一個通知 // 介面的嵌入的內部型別實現並沒有提升到 // 外部型別 sendNotification(&ad) // 我們可以直接存取內部型別的方法 ad.user.notify() // 內部型別的方法沒有被提升 ad.notify() } // sendNotification 接受一個實現了 notifier 介面的值 // 並行送通知 func sendNotification(n notifier) { n.notify() }上面程式碼所示的範例程式的大部分和之前的程式相同,只有一些小變化,這個範例程式為 admin 型別增加了 notifier 介面的實現。當 admin 型別的實現被呼叫時,會顯示 "Sending admin email"。作為對比,user 型別的實現被呼叫時,會顯示 "Sending user email"。
Sending admin email to john smith<[email protected]>
Sending user email to john smith<[email protected]>
Sending admin email to john smith<[email protected]>