多态:变量具有多种形态,可以用统一的接口来调用不同的实现。

接口体现多态特征:

(1)多态参数:之前所讲的Usb接口案例,既可以接受手机变量,也可以接受相机变量,就体现了usb接口的多态;

(2)多态数组:

package main

import (
"fmt"
) type usb interface {
start()
stop()
} type phone struct {
name string
} func (p phone) start() {
fmt.Println(p.name, "手机开始工作")
} func (p phone) stop() {
fmt.Println(p.name, "手机停止工作")
} type camera struct {
name string
} func (c camera) start() {
fmt.Println(c.name, "相机开始工作")
} func (c camera) stop() {
fmt.Println(c.name, "相机停止工作")
} type computer struct {
} func (co computer) working(usb usb) {
usb.start()
usb.stop()
} func main() {
var usbArr [3]usb
usbArr[0] = phone{"小米"}
usbArr[1] = phone{"vivo"}
usbArr[2] = camera{"尼康"}
fmt.Println(usbArr)
for i := 0; i < len(usbArr); i++ {
usbArr[i].start()
usbArr[i].stop()
}
}

我们以前讲到,数组是只能存储同一种类型的数据,利用多态数组,就可以存储不同的类型了;

如何将一个接口变量赋值给一个自定义类型的变量?使用类型断言

类型断言:由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言;要保持原来空接口指向的数据类型和断言的数据类型一致;

为了避免输出panic报错,可以进行断言判断;

类型断言实践一:

我们给phone中加入一个方法call(),在调用usb变量时,usb.call(),肯定是不对的,因为usb可能是phone,也可能是camera,而camera是没有这个函数的,因此,在调用的时候用类型断言。

package main

import (
"fmt"
) type usb interface {
start()
stop()
} type phone struct {
name string
} func (p phone) start() {
fmt.Println(p.name, "手机开始工作")
} func (p phone) call() {
fmt.Println(p.name,"手机在打电话")
} func (p phone) stop() {
fmt.Println(p.name, "手机停止工作")
} type camera struct {
name string
} func (c camera) start() {
fmt.Println(c.name, "相机开始工作")
} func (c camera) stop() {
fmt.Println(c.name, "相机停止工作")
} type computer struct {
} func (co computer) working(usb usb) {
usb.start()
//如果usb还指向phone的结构体变量,则还需要调用call方法
if phone, ok := usb.(phone); ok {
phone.call()
}

usb.stop()
} func main() {
var usbArr [3]usb
usbArr[0] = phone{"小米"}
usbArr[1] = phone{"vivo"}
usbArr[2] = camera{"尼康"}
var com computer
fmt.Println(usbArr)
for i := 0; i < len(usbArr); i++ {
com.working(usbArr[i])
}
}

类型断言实践2:循环判断输入参数的类型

package main

import (
"fmt"
) type student struct {
name string
} func typeJudge(items ...interface{}) {
for index, x := range items {
switch x.(type) {
case bool:
fmt.Printf("第%v个参数是bool类型,值是%v\n", index, x)
case int, int32, int64:
fmt.Printf("第%v个参数是整数类型,值是%v\n", index, x)
case float32:
fmt.Printf("第%v个参数是float32类型,值是%v\n", index, x)
case float64:
fmt.Printf("第%v个参数是float64类型,值是%v\n", index, x)
case string:
fmt.Printf("第%v个参数是string类型,值是%v\n", index, x)
case student:
fmt.Printf("第%v个参数是student类型,值是%v\n", index, x)
case *student:
fmt.Printf("第%v个参数是*student类型,值是%v\n", index, x)
default:
fmt.Printf("第%v个参数类型不确定,值是%v\n", index, x)
}
}
} func main() {
var n1 float32 = 1.1
var n2 float64 = 1.2
var n3 int32 = 1
var name string = "tom"
var n5 bool = true stu1 := student{"jack"}
stu2 := &student{"bob"} typeJudge(n1, n2, n3, name, n5, stu1, stu2)
}

(三十五)golang--面向对象之多态的更多相关文章

  1. JS基础入门篇(三十五)—面向对象(二)

    如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)

  2. “全栈2019”Java第三十五章:面向对象

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  4. Java进阶(三十五)java int与integer的区别

    Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...

  5. NeHe OpenGL教程 第三十五课:播放AVI

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. Gradle 1.12用户指南翻译——第三十五章. Sonar 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  7. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  8. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. Python进阶(三十五)-Fiddler命令行和HTTP断点调试

    Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令   上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的se ...

  10. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

随机推荐

  1. ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  2. LeetCode 5024 除数博弈 --(简单博弈论)

    今天在LeetCode的看到一到题目 这道题目有点坑,没有思路的话容易钻牛角. 刚刚开始时,我想的是直接用while循环来模拟计算,后来觉得这么好麻烦,也有复制的逻辑在里面.后面我推导了一下 以下是我 ...

  3. Kafka消费者 从Kafka中读取数据并写入文件

    Kafka消费者 从Kafka中读取数据 最近有需求要从kafak上消费读取实时数据,并将数据中的key输出到文件中,用于发布端的原始点进行比对,以此来确定是否传输过程中有遗漏数据. 不废话,直接上代 ...

  4. 微软并发Key-Value存储库FASTER介绍

    微软支持并发的Key-Value 存储库有C++与C#两个版本.号称迄今为止最快的并发键值存储.下面是C#版本翻译: FASTER C#可在.NET Framework和.NET Core中运行,并且 ...

  5. Spring(二)装配Spring Bean

    控制反转的概念:控制反转是一种通过描述(在Java中或者是XML或者注解)并通过第三方去产生或获取特定对象的方式. 在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependenc ...

  6. unity 之 自定义弹出框

    一.弹出框的搭建: 布局如图:Message为整个父物体,并且添加UiMessage代码.panel为遮罩. MessageBox为整个提示框,Panel为标题,ok为确定按钮,cancel为取消按钮 ...

  7. Gitlab在Centos7上的安装

    一 官网说明 安装步骤:https://about.gitlab.com/install/#centos-7 安装说明:本文只是用来给微服务当配置中心,只是较浅的记录一下安装步骤,后面会详细讲解及在d ...

  8. 用c语言实现前序创建二叉树(递归),分别用前序,中序,后序遍历,以及分别输出节点个数和叶子节点个数

    本人c语言小白一枚,近期在学习数据结构(c语言版),特写此随笔,做一些总结和分享,如有不当之处,请各位技术大牛斧正 首先我们用一个结构体来抽象树的结点,代码如下(这里我们存放的数据为char型,大家可 ...

  9. 用Python编写简单的发红包程序和计算器原理

    用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...

  10. Okhttp 请求流程梳理

    最近在看 Okhttp 的源码.不得不说源码设计的很巧妙,从中能学到很多.其实网上关于 Okhttp 的文章已经很多了,自己也看了很多.但是俗话说得好,好记性不如烂笔头,当你动手的时候,你会发现你在看 ...