golang中的接口实现(二)
指针类型 vs 值类型实现接口
package main
import (
"fmt"
)
// 定义接口
type Describer interface {
Describe()
}
// 定义一个类
type Person struct {
name string
age int
}
// 值类型的Person 实现了 Describe 方法
func (p Person) Describe() {
fmt.Printf("%s is %d years old\n", p.name, p.age)
}
// 定义一个类
type Address struct {
province string // 省
city string // 市
}
// 指针类型的 Address 实现了 Describe方法
func (a *Address) Describe() {
fmt.Printf("%s省 %s市 \n", a.province, a.city)
fmt.Println("35", &a)
}
func main() {
var d1 Describer // 接口类型变量
p1 := Person{"Sheldon", 18}
d1 = p1 //值类型
d1.Describe()
p2 := Person{"Leonard", 20}
d1 = &p2 // 指针类型
d1.Describe()
var d2 Describer
a1 := Address{"山东", "临沂"}
//d2 = a1 // tip ①
d2 = &a1
d2.Describe()
a1.Describe()
return
// ① &a1(*Address) 实现了 Describe 方法, 而 a1(值类型)没有实现Describe方法,
// 所以只有指针类型的 Address 对象可以转换为 Describe 接口对象。
实现多个接口
package main
import "fmt"
// 定义接口1
type Animal interface {
Eat()
}
// 定义接口2
type People interface {
Talk()
}
type Man struct {
name string
age int
}
// 实现接口1
func (m Man) Eat() {
fmt.Println("男人吃东西")
}
// 实现接口2
func (m Man)Talk() {
fmt.Println("男人讲话")
}
func main() {
var sheldon Man
sheldon.Eat()
sheldon.Talk()
}
接口的嵌套
(go 中没有类似 Java,C# 中的父类这种东西, 但是可以通过嵌入其他接口来创建新的接口.)
type Interface111 interface {
Method111()
}
type Interface222 interface {
Method222() int
}
type EmployeeOperations interface {
Interface111
Interface222
}
type Employee struct {
}
func (e Employee) Method111() {
}
func (e Employee) Method222() int {
return 18
}
func main() {
e := Employee{ }
var empOp EmployeeOperations = e
empOp.Method111() // 大接口对象操作方法
var i2 Interface111 = e
i2.Method111() // 小接口对象操作方法
}
接口零值
type Interface111 interface {
Method111()
}
func main() {
var i1 Interface111
if i1 == nil { ①
fmt.Printf("i1 is nil and 类型: %T 值: %v\n", i1, i1)
// i1 is nil and 类型: <nil> 值: <nil>
} else {
i1.Method111()
}
}
// ① 使用 nil 接口对象调用方法的话,则程序会 panic,
// 因为 nil interface既没有底层的值也没有对应的具体类型. 类似于 JAVA 的空指针异常!
golang中的接口实现(二)的更多相关文章
- golang中的接口值
package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参 ...
- golang中的接口实现(一)
golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } ...
- golang中的接口
CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...
- 七、golang中接口、反射
一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...
- 六、golang中的结构体和方法、接口
结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...
- Golang中的坑二
Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...
- golang中接口interface和struct结构类的分析
再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...
随机推荐
- maven-java包管理工具-01
maven只用来管理java项目,也是用java开发的 传统的项目因为包的管理有很多问题,所以才有的maven的诞生: 1. 项目开始的时候,确定项目中可能要使用到的包,然后下载包,复制粘贴到项目里面 ...
- OSLab多进程
日期:2019/3/23 内容:Linux下与多进程相关的函数. 进程基本知识 定义 应用程序关于某数据集合上的一次运行活动. 特点 ·操作系统进行资源分配和调度的基本单位 ·进程是程序的一次 ...
- vue.js 常用组件库
vux github ui demo:https://github.com/airyland/vux Mint UI 项目主页:http://mint-ui.github.io/#!/zh-cndem ...
- C# Windows Service中执行死循环轮询
用C#编写Windows Service时,执行轮询一般有两种方式,一种是用Timer,System.Timers或者是System.Thread下的,这种执行是按时间循环执行,缺点是也许上个执行还没 ...
- 第十三章 ReentrantLock 简介
Java 5.0 提供的新的加锁机制:当内置加锁机制不适合时 , 作为一种可选择的高级功能 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一 ...
- .net core Error -4090 EADDRNOTAVAIL address not available”
问题原因:IP地址错误或者网络未开
- go generate命令有啥作用呢?
go generate命令其实就是用来生成代码用的,一般情况下需要配置其他工具和库一起使用 go官网有个实例: painkiller.go package painkiller type Pill i ...
- [视频]K8飞刀 ms15022 office漏洞演示动画
[视频]K8飞刀 ms15022 office漏洞演示动画 https://pan.baidu.com/s/1eQnV8qQ
- [Umbraco] Data Types介绍
Data Types是在建立document type时需要用到的,系统自带了很多用于开发的类型,如常用的下拉列表dropdown, textbox, radiobox, checkbox以及上传,h ...
- Metasploit数据库问题汇总
数据库在metaspoit中是相当重要的,当做一个大型渗透测试项目的时候,收集到的信息是相当大的,当和你的同伴一起协同作战的时候,你们可能 在不同的地方,所以数据共享很重要了!而且Metasploit ...