demo1
// Sample program to show how to embed a type into another type and // the relationship between the inner and outer type. package main import ( "fmt" ) // user defines a user in the program. type user struct { name string email string } // notify implements a method that can be called via // a value of type user. func (u *user) notify() { fmt.Printf("Sending user email to %s<%s>\n", u.name, u.email) } // admin represents an admin user with privileges. type admin struct { user // Embedded Type level string } // main is the entry point for the application. func main() { // Create an admin user. ad := admin{ user: user{ name: "john smith", email: "john@yahoo.com", }, level: "super", } // We can access the inner type's method directly. ad.user.notify() // The inner type's method is promoted. ad.notify() }
输出
Sending user email to john smith<john@yahoo.com>
Sending user email to john smith<john@yahoo.com>
demo2
// Sample program to show how to embed a type into another type and // the relationship between the inner and outer type. package main import ( "fmt" ) // user defines a user in the program. type user struct { name string email string } // notify implements a method that can be called via // a value of type user. func (u *user) notify() { fmt.Printf("Sending user email to %s<%s>\n", u.name, u.email) } // admin represents an admin user with privileges. type admin struct { user // Embedded Type level string } func (u *admin) notify() { fmt.Printf("admin method!\n") } // main is the entry point for the application. func main() { // Create an admin user. ad := admin{ user: user{ name: "john smith", email: "john@yahoo.com", }, level: "super", } // We can access the inner type's method directly. ad.user.notify() // The inner type's method is promoted. ad.notify() }
输出
Sending user email to john smith<john@yahoo.com>
admin method!
demo3
// Sample program to show how embedded types work with interfaces. package main import ( "fmt" ) // notifier is an interface that defined notification // type behavior. type notifier interface { notify() } // user defines a user in the program. type user struct { name string email string } // notify implements a method that can be called via // a value of type user. func (u *user) notify() { fmt.Printf("Sending user email to %s<%s>\n", u.name, u.email) } // admin represents an admin user with privileges. type admin struct { user level string } // main is the entry point for the application. func main() { // Create an admin user. ad := admin{ user: user{ name: "john smith", email: "john@yahoo.com", }, level: "super", } // Send the admin user a notification. // The embedded inner type's implementation of the // interface is "promoted" to the outer type. sendNotification(&ad) } // sendNotification accepts values that implement the notifier // interface and sends notifications. func sendNotification(n notifier) { n.notify() }
输出
Sending user email to john smith<john@yahoo.com>