zoukankan      html  css  js  c++  java
  • 8. Embedding 嵌入

    Declaring Fields

    // Sample program to show how what we are doing is NOT embedding
    // a type but just using a type as a field.
    //示例程序演示我们所做的不是嵌入的。
    // a类型,只是使用类型作为字段。
    package main
    
    import "fmt"
    
    // user defines a user in the program.
    type user struct {
    	name  string
    	email string
    }
    
    // notify implements a method notifies users 通知实现方法通知用户。
    // of different events.
    func (u *user) notify() {
    	fmt.Printf("Sending user email To %s<%s>
    ",
    		u.name,
    		u.email)
    }
    
    // admin represents an admin user with privileges. admin代表具有特权的admin用户。
    type admin struct {
    	person user // NOT Embedding
    	level  string
    }
    
    func main() {
    
    	// Create an admin user.
    	ad := admin{
    		person: user{
    			name:  "admin1",
    			email: "admin1@qq.com",
    		},
    		level: "super",
    	}
    	// We can access fields methods.
    	ad.person.notify()
    }
    
    /*
    Sending user email To admin1<admin1@qq.com>
    */
    

    Embedding types

    // 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 notifies users
    // of different events.
    
    //通知实现方法通知用户。
    //不同的事件。
    func (u *user) notify() {
    	fmt.Printf("Sending user email To %s<%s>
    ",
    		u.name,
    		u.email)
    }
    
    // admin represents an admin user with privileges.
    type admin struct {
    	user  // Embedded Type 埋入式
    	level string
    }
    
    func main() {
    	//	create an admin user
    	ad := admin{
    		user: user{
    			name:  "tomcat",
    			email: "tomcat@aa.com",
    		},
    		level: "super",
    	}
    
    	// We can access the inner type's method directly. 我们可以直接访问内部类型的方法。
    	ad.user.notify()
    
    	// The inner type's method is promoted. 提升了内部类型的方法。
    	ad.notify()
    
    }
    
    

    Embedded types and interfaces

    // Sample program to show how embedded types work with interfaces.
    
    package main
    
    import "fmt"
    
    // notifier is an interface that defined notification
    // type behavior.
    // notifier是一个定义通知的接口。
    // 类型的行为。
    
    type notifier interface {
    	notify()
    }
    
    // user defines a user in the program.
    type user struct {
    	name  string
    	email string
    }
    
    // notify implements a method notifies users
    // of different events.
    
    func (u *user) notify() {
    	fmt.Printf("send user email to%s<%s>
    ",
    		u.name,
    		u.email)
    }
    
    // admin represents an admin user with privileges.
    type admin struct {
    	user
    	level string
    }
    
    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)
    	//	 send user email tojohn smith<john@yahoo.com>
    
    }
    
    // sendNotification accepts values that implement the notifier
    // interface and sends notifications.
    // sendNotification接受实现通知的值。
    // 接口和发送通知。
    func sendNotification(n notifier) {
    	n.notify()
    
    }
    
    

    Outer and inner type interface implementations 外部和内部类型接口实现。

    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 notifies users
    // of different events.
    func (u *user) notify() {
    	fmt.Printf("Sending user email To %s<%s>
    ",
    		u.name,
    		u.email)
    }
    
    // admin represents an admin user with privileges.
    type admin struct {
    	user
    	level string
    }
    
    // notify implements a method notifies admins
    // of different events.
    func (a *admin) notify() {
    	fmt.Printf("Sending admin Email To %s<%s>
    ",
    		a.name,
    		a.email)
    }
    
    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 NOT "promoted" to the outer type.
    	//发送管理用户通知。
    	//嵌入式内部类型的实现。
    	//界面不是“提升”到外部类型。
    	sendNotification(&ad)
    
    	// We can access the inner type's method directly. 我们可以直接访问内部类型的方法。
    	ad.user.notify()
    
    	// The inner type's method is NOT promoted. 内部类型的方法没有被提升。
    	ad.notify()
    }
    
    // sendNotification accepts values that implement the notifier
    // interface and sends notifications.
    func sendNotification(n notifier) {
    	n.notify()
    }
    
    /*
    Sending admin Email To john smith<john@yahoo.com>
    Sending user email To john smith<john@yahoo.com>
    Sending admin Email To john smith<john@yahoo.com>
    */
    
    

    练习

    // Copy the code from the template. Declare a new type called hockey
    // which embeds the sports type. Implement the finder interface for hockey.
    // When implementing the find method for hockey, call into the find method
    // for the embedded sport type to check the embedded fields first. Then create
    // two hockey values inside the slice of finders and perform the search.
    //复制模板中的代码。宣布一种新型的曲棍球。
    //这是体育运动的类型。实现曲棍球的finder接口。
    //在实现曲棍球的查找方法时,请调用find方法。
    //对于嵌入式运动类型,首先要检查嵌入式字段。然后创建
    //两个曲棍球值,在切片的发现者和执行搜索。
    
    package main
    
    import (
    	"fmt"
    	"strings"
    )
    
    // finder defines the behavior required for performing matching. finder定义了执行匹配所需的行为。
    type finder interface {
    	find(needle string) bool
    }
    
    // sport represents a sports team. 体育代表队。
    type sport struct {
    	team string
    	city string
    }
    
    // find checks the value for the specified term. 查找检查指定项的值。
    func (s *sport) find(needle string) bool {
    	return strings.Contains(s.team, needle) || strings.Contains(s.city, needle)
    }
    
    // hockey represents specific hockey information. 曲棍球代表特定的曲棍球信息。
    type hockey struct {
    	sport
    	country string
    }
    
    // find checks the value for the specified term. 查找检查指定项的值。
    func (h *hockey) find(needle string) bool {
    	return h.sport.find(needle) || strings.Contains(h.country, needle)
    }
    
    func main() {
    	// Define the term to find.
    	needle := "Miami"
    
    	// Create a slice of finder values and assign values
    	// of the concrete hockey type.
    	haystack := []finder{
    		&hockey{sport{"Panthers", "Miami"}, "USA"},
    		&hockey{sport{"Canadiens", "Montreal"}, "Canada"},
    	}
    
    	// Display what we are trying to find.
    	fmt.Println("Searching For:", needle)
    
    	// Range of each haystack value and check the term.
    	for _, hs := range haystack {
    		if hs.find(needle) {
    			fmt.Printf("FOUND: %+v", hs)
    		}
    	}
    
    }
    
    /*
    Searching For: Miami
    FOUND: &{sport:{team:Panthers city:Miami} country:USA}
    */
    
    
  • 相关阅读:
    php 扩展编译linux
    PHP 单态设计模式
    Apache 支持.htaccess
    Apache 禁止访问目录
    jQuery 获取父元素、子元素、同级元素
    CentOS 配置防火墙操作实例(启、停、开、闭端口):
    CentOS 安装 lamp(转)
    火狐浏览器 js 1到9月份 new DATE不返回时间
    web 打开子窗口提交数据或其他操作后 关闭子窗口且刷新父窗口实现
    jquery on 绑定多个事件 多个元素
  • 原文地址:https://www.cnblogs.com/zrdpy/p/8586989.html
Copyright © 2011-2022 走看看