golang 结构体中的匿名接口

代码示例

golang 中,可以给结构体增加匿名field,可参考 unknwon 大神的书。

匿名字段和内嵌结构体

但,golang同时也可以给结构体定义一个匿名interface field,用法:

标准库 sort 中,有下面的写法:

type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
} type reverse struct {
Interface
} func (r reverse) Less(i, j int) bool {
return r.Interface.Less(j, i)
} func Reverse(data Interface) Interface {
return &reverse{data}
}

reverse结构体内嵌了一个Interface的interface,并且,提供了单独的Less函数定义。

却没有提供 Len, Swap 的定义。

首先,根据结构体内嵌其它匿名字段的定义,可以推知,理论上,调用reverse.Len, reverse.Swap

肯定是会直接传递到 reverse.Interface.Lenreverse.Interface.Swap

即,和直接调用Interface的同名函数没有任何区别。

但,reverse提供了单独的Less函数,它的实现是颠倒了i,j参数,仍然送入到Interface.Less中去,

那么,得出的结果与直接使用Interface排序的结果,肯定是相反的。

为什么如此设计?

Meaning of a struct with embedded anonymous interface?

摘录其中比较关键的解释如下:

  1. In this way reverse implements the sort.Interface and we can override a specific method without having to define all the others.
  2. 结构体创建时,可以使用任何实现了Interface的obj来初始化,参考:
package main

import "fmt"

// some interface
type Stringer interface {
String() string
} // a struct that implements Stringer interface
type Struct1 struct {
field1 string
} func (s Struct1) String() string {
return s.field1
} // another struct that implements Stringer interface, but has a different set of fields
type Struct2 struct {
field1 []string
dummy bool
} func (s Struct2) String() string {
return fmt.Sprintf("%v, %v", s.field1, s.dummy)
} // container that can embedd any struct which implements Stringer interface
type StringerContainer struct {
Stringer
} func main() {
// the following prints: This is Struct1
fmt.Println(StringerContainer{Struct1{"This is Struct1"}})
// the following prints: [This is Struct1], true
fmt.Println(StringerContainer{Struct2{[]string{"This", "is", "Struct1"}, true}})
// the following does not compile:
// cannot use "This is a type that does not implement Stringer" (type string)
// as type Stringer in field value:
// string does not implement Stringer (missing String method)
fmt.Println(StringerContainer{"This is a type that does not implement Stringer"})
}

golang 结构体中的匿名接口的更多相关文章

  1. golang 结构体嵌入和匿名成员

    考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形.椭圆形.星形和轮形等几 何形状.这里是其中两个的定义 type Circle struct { X, Y, Radius int } type ...

  2. 六、golang中的结构体和方法、接口

    结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...

  3. golang结构体、接口、反射

    struct结构体 struct用来自定义复杂数据结构,可以包含多个字段属性,可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型. struc ...

  4. Golang结构体struct的使用(结构体嵌套, 匿名结构体等)

    转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...

  5. golang中结构体中的嵌套

    package main import "fmt" type Base struct { name string } func (b *Base) m1() int { retur ...

  6. GO开发[五]:golang结构体struct

    Go结构体struct Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性 ...

  7. 【转】golang 结构体和方法

    原文:https://www.jianshu.com/p/b6ae3f85c683 ---------------------------------------------------------- ...

  8. Golang结构体值的交换

    Golang结构体值的交换 一.添加结构体,多if暴力 最先遇到这个问题是在比编写PUT方法的接口时遇到. (我公司编写http put方法,是先解析json至StudentInput结构体中,通过i ...

  9. sturct stat 结构体中 st_mode 的含义

    工作中遇到 else if( (s_buf.st_mode&S_IFMT) == S_IFDIR) return 2; else if( !(s_buf.st_mode&S_IFREG ...

随机推荐

  1. Heap Sort - recursion

    Heap Sort  Build a max heap using exsiting array, which is called Heapify Swap root with the last el ...

  2. Hive的初识

    Hive是构建于Hadoop上的数据仓库基础框架,它提供了以下功能: 可通过SQL轻松的访问数据,从而实现数据仓库的任务.如提取/转换/加载,报告和数据分析. 对各种数据格式施加结构. 访问存储在HD ...

  3. CentOS 7 yum安装nginx-1.12.0

    CentOS 7 中的 yum 没法直接使用 yum install nginx 这个指令去安装nginx,因为nginx这个服务不是yum库中自带的.图1是官方提供的大致安装步骤,图2是官网提供的多 ...

  4. MySQL-8.0.11与Navicat Premium安装教程

    1. 下载MySQL 下载地址: https:////dev.mysql.com/downloads/mysql/ 百度云 链接:https://pan.baidu.com/s/1bxAtnvChZZ ...

  5. maven 使用axis2 client 需要导入的依赖

    <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2</artif ...

  6. 使用django发布带图片的网页(上)

    如何使用django发布带静态图片的网页呢? 在settings.py里加入下面内容 STATIC_ROOT = os.path.join(os.path.dirname(__file__),'sta ...

  7. UE4 材质编辑

    1.颜色反转(纹理颜色白变黑,黑变白)

  8. javascript window对象常用方法

    方法名称 prompt():显示可提示用户输入的对话框 alert():显示带有一个提示信息和 一个确定按钮的警示框 confirm():显示一个 带有提示信息.确定和取消按钮的对话框 open(): ...

  9. BInsertSort

    #include <bits/stdc++.h> using namespace std; #define MAXSIZE 200000 typedef int KeyType; type ...

  10. 自己实现一个jQuery插件

    <script src="https://cdn.staticfile.org/jquery/2.0.3/jquery.min.js"></script> ...