指针类型 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. delphi编写与调用DLL(delphi7下测试通过)

    http://blog.sina.com.cn/s/blog_4dbbf76f01000anz.html delphi编写DLL 下面在delphi中编写一个简单的dll,在该dll中只有一个max函 ...

  2. 使用PerfView监测.NET程序性能(二):Perfview的使用

    在上一篇博客中,我们了解了对Windows及应用程序进行性能分析的基础:Event Trace for Windows (ETW).现在来看看基于ETW的性能分析工具——Perfview.exe Pe ...

  3. Asp .Net core 2 学习笔记(1) —— Starup

    这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源: ASP.NET Core 中文文档目录 官方文档 记在这里的东西我会不断的完善丰满,对于文章 ...

  4. 初识Identity并添加身份验证管理页面

    目录 初识Identity并添加身份验证管理页面 前言 什么是ASP.NET Core Identity 创建带有身份验证的WebApp 尝试运行 检查解决方案中的项目文件 发现问题 原因 解决问题 ...

  5. WPF DataGrid分组和排序

    之前一直用的Dev的GridControl,控件自带分组排序啥的.今天试了下在wpf自带的Datagrid控件上实现分组和排序. Datagrid上实现这些功能主要用到CollectionViewSo ...

  6. 【转】PowerDesigner code、name显示设置 及 同时显示办法

    原文地址:http://blog.csdn.net/fy_hanxu/article/details/52468927 菜单->Tool->Model Options->Name C ...

  7. Mac下更改Mysql5.7的默认编码为utf8

    Mac上从官方安装完Mysql5.7后,有一部分的字符集默认为latin1,而非utf8,为避免乱码的产生,本文介绍将所有字符集设置为utf8 查看当前字符集编码 show variables lik ...

  8. 面向对象——单例模式,五种方式

    单例模式:多次实例化的结果指向同一个实例 实现方式 一.使用类方法(调用创新对象,函数返回原定对象) import settings class Mysql: __instance = None de ...

  9. python3之paramiko模块

    1.paramiko模块介绍 paramiko模块提供了基于ssh连接,进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装. 2.paramiko的使用方法 (1 ...

  10. jzoj4229

    按照題意暴力模擬即可 #include<bits/stdc++.h> using namespace std; int m; typedef long long ll; ll a1,q,n ...