Go语言学习笔记 - PART9 - 接口

栏目: Go · 发布时间: 5年前

内容简介:Go语言不是传统的面向对象编程语言,接口类型变量可以包含任何类型的值,所以需要在运行时检测变量中存储的值的实际类型varI必须是一个接口类型变量

Go语言不是传统的面向对象编程语言, 没有类和继承的概念 ,但是有非常灵活的接口,可以实现面向对象的特征,接口提供一种方式来说明对象的行为

定义接口

type Namer interface {
        Method1(param_list) return_type
        Method2(param_list) return_type
        ...
    }
复制代码

接口命名方式

  • 方法名 + er后缀(接口只有一个方法的时候)
  • 接口以able结尾
  • 以大写字母I开头

接口实现规则

  • 接口可以被隐式实现,多个类型可以实现同一个接口
  • 实现接口的某个类型还可以有其他的方法
  • 一个类型可以实现多个接口
// 1. 定义一个接口
    type Shaper interface {
    	Area() float32
    }
    
    type Square struct {
    	side float32
    }
    
    // 2. Square类型指针实现接口中的方法
    func (sq *Square) Area() float32 {
    	return sq.side * sq.side
    }
    
    type Rectangle struct {
    	length, width float32
    }
    
    // 3. Rectangle类型实现接口中的方法
    func (r Rectangle) Area() float32 {
    	return r.length * r.width
    }
    
    func main() {
    
    	r := Rectangle{5, 3} 
    	q := &Square{5}
    	// 4. 通过接口数组接收两个变量
    	shapes := []Shaper{r, q}
    	fmt.Println("Looping through shapes for area ...")
    	for n, _ := range shapes {
    		fmt.Println("Shape details: ", shapes[n])
    		// 5. 实现多态
    		fmt.Println("Area of this shape is: ", shapes[n].Area())
    	}
    }
复制代码

接口嵌套

  • 一个接口可以包含多个接口,相当于将内嵌接口的方法列举在外层接口
// 1. 定义接口ReadWrite和Lock
    type ReadWrite interface{
        Read(b Buffer) bool
        Write(b Buffer) bool
    }
    type Lock integer{
        Lock()
        Unlock()
    }
    // 2. 在接口中添加了两个匿名字段:ReadWrite和Lock,实现接口嵌套
    type File interface{
        ReadWrite
        Lock
        Close()
    }
复制代码

接口变量类型断言

接口类型变量可以包含任何类型的值,所以需要在运行时检测变量中存储的值的实际类型

t := varI.(T)
    // 或者可以使用下面这种方式
    if t, ok := varI.(T); ok {
        Process(t)
        return
    }
复制代码

varI必须是一个接口类型变量

类型判断(type - switch)

接口变量的类型也可以使用switch来检测

switch t := areaIntf.(type) {
    case *Square:
    	fmt.Printf("Type Square %T with value %v\n", t, t)
    case *Circle:
    	fmt.Printf("Type Circle %T with value %v\n", t, t)
    case nil:
    	fmt.Printf("nil value: nothing to check?\n")
    default:
    	fmt.Printf("Unexpected type %T\n", t)
    }
复制代码

type - switch中不允许有fallthrough

接口方法集调用规则

  • 类*T可调用方法集包括接收者为*T和T的所有方法集
  • 类型T的可调用方法集包含接收者T的所有方法,但不包含接收者为*T的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

奇点系列

奇点系列

彼得•蒂尔、里德•霍夫曼、本•霍洛维茨、埃里克•杰克逊等 / 高玉芳、路蒙佳、杨晓红、徐彬等 / 中信出版社 / 2015-6-20 / 182.00

1.硅谷创投教父、PayPal创始人彼得•蒂尔、LinkedIn创始人里德•霍夫曼、创业导师本•霍洛维茨、“PayPal黑帮”初创成员埃里克•杰克逊联合作品。 2.彼得•蒂尔与埃隆•马斯克的首次交锋,PayPal从0到1改变全球金融的生死突围,商业硬汉的创业史诗,揭秘“PayPal黑帮”的创业维艰与联盟关系。 3.《人民日报》推荐创业者必读书目!“奇点系列”的作者们以及“PayPal黑......一起来看看 《奇点系列》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具