指针类型 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中的接口实现(二)的更多相关文章

  1. golang中的接口值

    package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参 ...

  2. golang中的接口实现(一)

    golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } ...

  3. golang中的接口

    CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...

  4. 七、golang中接口、反射

    一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...

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

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

  6. Golang中的坑二

    Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...

  7. golang中接口interface和struct结构类的分析

    再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...

  8. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  9. Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现

    前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...

随机推荐

  1. ?js调用PHP里的变量,怎么弄?

    js调用PHP里的变量,怎么弄 网上给的例子都是js文件里一开始先给这个变量一个值,要是那样有啥意思啊,我要的就是可以变化的. hychyc_2008 | 浏览 2741 次  2013-04-18 ...

  2. 设置UITableView分割线距左边的间距

    ``` [self.tableView setSeparatorInset:UIEdgeInsetsZero]; [self.tableView setLayoutMargins:UIEdgeInse ...

  3. CentOS 7.2通过yum安装MairaDB 10.1

    CentOS 7.2自带的yum源中mysql已经被替换成了mariadb,然而却是5.5版本,匹配mysql5.5,想要使用mysql 5.7的特性需要mariadb 10.0或10.1版本,10. ...

  4. 集成算法(chapter 7 - Hands on machine learning with scikit learn and tensorflow)

    Voting classifier 多种分类器分别训练,然后分别对输入(新数据)预测/分类,各个分类器的结果视为投票,投出最终结果: 训练: 投票: 为什么三个臭皮匠顶一个诸葛亮.通过大数定律直观地解 ...

  5. ue4开发入门教程

    ue4是一套开源跨平台的游戏引擎,游戏画质3A水准,具有强大的材质编辑器,各种插件齐全.想要学习ue4的,可以参考这篇文章作为入门. 学习这篇文章,建议具有一定的C++基础,对游戏有一定了解. 1.首 ...

  6. .Net Core Razor 预编译,动态编译,混合编译

    预编译 预编译是ASP .Net Core的默认方式.在发布时,默认会将系统中的所有Razor视图进行预编译.编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xx ...

  7. .NET Core中使用EF Core连接MySQL

    最近一直在捣鼓.NET Core方面的东西,顺便写下点东西记录下 1.打开vs2017,新建一个项目 2.vs会自动生成一个项目,然后打开NuGet搜索MySql.Data.EntityFramewo ...

  8. eclipse代码提示javadoc背景为黑色框的解决办法

    我的eclipse是近期下载的oxygen版本.不知道怎么出现了一个这个问题,鼠标悬停指向代码时应该出现的代码提示解释框,全为黑色,看不到文字.如下图 经过验证,最终解决方法为window->G ...

  9. springboot2 生产部署注意事项【持续更新】

    注意事项1. 去除不需要的 jar 开发工具 jar :springs-boot-devtools2. 监控一定要做好权限制或者去除 控制 jar :spring-boot-starter-actua ...

  10. js判断是否手机自动跳转移动端

    写法一: {literal} <script> //判断是否手机自动跳转 var browser={versions:function(){var u=navigator.userAgen ...