使用指针接收器和值接收器实现接口
type Describer interface {
Describe()
} type Person struct {
name string
age int
} func (p Person) Describe() {
fmt.Printf("%s is %d years old\n", p.name, p.age)
} type Address struct {
state string
country string
} func (a *Address) Describe() {
fmt.Printf("State %s Country %s", a.state, a.country)
} var d1 Describer
p1 := Person{"Sam", 25}
d1 = p1
d1.Describe()
p2 := Person{"James", 39}
d1 = &p2
d1.Describe() var d2 Describer
a := Address{"Beijing", "China"}
d2 = &a
d2.Describe()
实现多个接口
type NormalSalary interface {
DisplaySalary()
} type LevaeSalary interface {
CalculateLeaveLeft() int
} type Employee struct {
firstName string
lastName string
basicPay int
pf int
totalLeaves int
leavesTaken int
} func (e Employee) DisplaySalary() {
fmt.Printf("%s %s has salary $%d\n", e.firstName, e.lastName, (e.basicPay + e.pf))
} func (e Employee) CalculateLeaveLeft() int {
return e.totalLeaves - e.leavesTaken
} e := Employee{
firstName: "Kevin",
lastName: "Lee",
basicPay: 5000,
pf: 200,
totalLeaves: 30,
leavesTaken: 5,
} var ns NormalSalary = e
ns.DisplaySalary() var l LevaeSalary = e
fmt.Println("Leaves left =", l.CalculateLeaveLeft())
接口嵌套

Go语言中没有继承的概念,但是通过组合可以实现继承的效果

type NormalSalary interface {
DisplaySalary()
} type LevaeSalary interface {
CalculateLeaveLeft() int
} type SalaryOperator interface {
NormalSalary
LevaeSalary
} var empOp SalaryOperator = e
empOp.DisplaySalary()
fmt.Println("Leaves left = ", empOp.CalculateLeaveLeft())
接口零值

零值接口是nil,nil接口中的typevalue都是nil

type Describer interface {
Describe()
} var d4 Describer
if d4 == nil {
fmt.Printf("d4 is nil and has type %T value %v\n", d4, d4)
}

输出结果是

d4 is nil and has type <nil> value <nil>

Go语言之Interface(二)的更多相关文章

  1. Go语言基础(二)

    Go语言基础(二) 跟着上篇,继续看Go基础 一.变量作用域 与C类似,有全局变量.局部变量.形参之分 package main import "fmt" // 全局变量 var ...

  2. Go语言学习笔记二: 变量

    Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...

  3. Go 语言入门(二)方法和接口

    写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(二 ...

  4. 浅析Go语言的Interface机制

    前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...

  5. Java语言基础(二) Java关键字

    Java语言基础(二) Java关键字 Java关键字比较多,我就不列举出来了,只记录一些常用的小知识点: ①Java的关键字只有小写. ②then.sizeof都不是Java的关键字,熟悉C++的程 ...

  6. Java语言基础(二)

    Java语言基础(二) 一.变量续 (1).变量有明确的类型 (2).变量必须有声明,初始化以后才能使用 (3).变量有作用域,离开作用域后自动回收 变量作用域在块内有效 (4).在同一定义域中变量不 ...

  7. R语言语法基础二

    R语言语法基础二 重塑数据 增加行和列 # 创建向量 city = c("Tampa","Seattle","Hartford"," ...

  8. Go语言之Interface(一)

    Go语言之Interface(一) 什么是interface 在面向对象语言中接口是:接口定义了一个对象的行为,但在Go中接口就是方法签名的集合,当一个类型提供了这个接口中的所有的方法,就可以说这个类 ...

  9. C语言第十二讲,文件操作.

    C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件 ...

随机推荐

  1. Springboot访问静态资源

    转载 http://blog.csdn.net/catoop/article/details/50501706

  2. windows socket 文件下载上传

    socket 图片 文件 下载上传  数据库 线程池  存入图片 等

  3. Python3 单下划线_双下划线__开头

    Python 中,下划线对解释器有特殊的含义,而且是内建标识符所使用的符号,使用时要多加留意. 在 Python3 的面向对象中,双下划线开头的变量和方法表名为私有变量和私有方法. __private ...

  4. AX_RecordSortedList

    static void RecordSortedList(Args _args) { SalesLine localSalesLine,fetchSalesLine; RecordSortedList ...

  5. 【信号与线性系统】为什么求解零输入响应时转移算子H(p)不能约分,但计算单位冲激响应时却可以约分?

    为什么求零输入响应rZI时转移算子H(p)不能约分? . . . 我们知道,求零输入响应rZI的实质其实是求解微分方程 D(p)r(t) = N(p)e(t) 的解.由于这里 e(t)=0 ,所以这是 ...

  6. mongodb分组排序

    @Override public MessageDto getCheckInMembersByFlight(String fltDt, String fltNr, String channel,Str ...

  7. su与su -的区别

    su命令从普通用户切换到root用户下虽然可以切换,但是切换过后它所属的环境变量没有切换回原本属于root本身该有的环境变量,使用su - root 就可以切换会本来用户所属自身的变量

  8. Python Day 13 装饰器

    阅读目录   内容回顾 函数嵌套的定义 global.nonlocal关键字 闭包及闭包的运用场景 开放封闭原则 装饰器 一个函数被多次装饰 ##内容回顾 1.函数对象:函数名 => 存放的是函 ...

  9. sklearn svm基本使用

    SVM基本使用 SVM在解决分类问题具有良好的效果,出名的软件包有libsvm(支持多种核函数),liblinear.此外python机器学习库scikit-learn也有svm相关算法,sklear ...

  10. 第46章:MongoDB-监控应用状态

    ① MongoDB监控  1 db.serverStatus() 查看实例运行状态(内存使用.锁.用户连接等信息) 通过比对前后快照进行性能分析 "connections" # 当 ...