使用go的interface案例实现多态范式操作

看程序:

package main
import "fmt"
type BaseIntf interface {
 Process()
}

type Msg1 struct {
 req int
 rsp int
}

func (p *Msg1) Process() {
 fmt.Println("process 1")
}

type Msg2 struct {
 req int
 rsp int
}

func (p *Msg2) Process() {
 fmt.Println("process 2")
}

func main() {
 m1 := new(Msg1)
 m1.Process()

 m2 := new(Msg2)
 m2.Process()
}

变一下:

package main
import "fmt"
type BaseIntf interface {
 Process()
}

func Run(proc BaseIntf) {
 fmt.Println("run")
 proc.Process()
}

type Msg1 struct {
 req int
 rsp int
}

func (p *Msg1) Process() {
 fmt.Println("process 1")
} 

type Msg2 struct {
 req int
 rsp int
}

func (p *Msg2) Process() {
 fmt.Println("process 2")
} 

func main() {
 m1 := new(Msg1)
 Run(m1)

 m2 := new(Msg2)
 Run(m2)
}

这种风格的代码,见了很多次了。

不多说。

补充:go语言中通过空接口查询来实现多态

直接看代码吧~ 空接口算是go语言的精妙之处

package main
type Person struct {
 name string
 age int
}
type Cat struct {
 kind string
 sex bool
 price int
}
func main() {
 family := make([]interface{},0,10)
 obj1 := &Person{
 name: "吕云飞",
 age: 28,
 }
 obj2 := &Person{
 name: "胡景茹",
 age: 18,
 }
 obj3 := &Cat{
 kind: "英短",
 sex: true,
 price: 2000,
 }
 family = append(family, obj1, obj2, obj3)
 for _, value := range family {
 switch obj := value.(type) {
 case *Person:
 print(obj.name + "\n")
 case *Cat:
 print(obj.kind + "\n")
 }
 }
}

输出结果如下

吕云飞

胡景茹

英短

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Go之interface的具体使用

    浅显地了解了一下 Go,发现 Go 语法的设计非常简洁,易于理解.正应了 Go 语言之父 Rob Pike 说的那句"Less is more"-- 大道至简. 下面就具体的语法特性说说我自己的体会. interface 概览 与通常以类型层次与继承为根基的面向对象设计(OOP)语言(如C++.Java)不同,Go 的核心思想就是组合(composition).Go 进一步解耦了对象与操作,实现了真正的鸭子类型(Duck typing):一个对象如果能嘎嘎叫那就能当做鸭子,而不是像 C

  • golang基础之Interface接口的使用

    接口是一个或多个方法签名名的集合,定义方式如下 type Interface_Name interface { method_a() string method_b() int .... } 只要某个类型拥有该接口的所有方法签名,就算实现该接口,无需显示声明实现了那个接口,这称为structural Typing package main import "fmt" type USB interface { //定义一个接口:方法的集合 Name() string //Name方法,返回

  • golang语言如何将interface转为int, string,slice,struct等类型

    在golang中,interface{}允许接纳任意值,int,string,struct,slice等,因此我可以很简单的将值传递到interface{},例如: package main import ( "fmt" ) type User struct{ Name string } func main() { any := User{ Name: "fidding", } test(any) any2 := "fidding" test(a

  • golang中struct和interface的基础使用教程

    前言 本文主要给大家介绍了关于golang中struct和interface的相关内容,是属于golang的基本知识,下面话不多说了,来一起看看详细的介绍吧. struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套:go中的struct类型理解为类,可以定义方法,和函数定义有些许区别:struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User

  • golang struct 实现 interface的方法

    golang中,一般strcut包含 interface类型后,struct类型都需要实现 interface导出的接口,从而成为相应的 interface接口类. 实际上,struct包含interface之后,并不需要实现interface的接口,也能成为 interface接口类. 代码如下: type newEr interface { New() } type testInterface interface { newEr Done() <-chan struct{} } type k

  • golang 实现interface{}转其他类型操作

    golang中的string是可以转换为byte数组或者rune数组 但是其实byte对应的类型是uint8,而rune对应的数据类型就是int32 所以string可以转换为四种类型 //interface转其他类型----返回值是interface,直接赋值是无法转化的 //interface 转string var a interface{} var str5 string a = "3432423" str5 = a.(string) fmt.Println(str5) //i

  • 使用go的interface案例实现多态范式操作

    看程序: package main import "fmt" type BaseIntf interface { Process() } type Msg1 struct { req int rsp int } func (p *Msg1) Process() { fmt.Println("process 1") } type Msg2 struct { req int rsp int } func (p *Msg2) Process() { fmt.Println

  • go语言interface接口继承多态示例及定义解析

    目录 1.什么是接口 2.接口定义 3.多态 多态加减计算器 4.接口继承与转换 5.空接口 6.接口转换 7.实现map字典接口 8.interface案例 1.什么是接口 接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接.为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了. 在程序开发中,接口只是规定了要做哪些事情,干什么.具体怎么做,接口是不管的.这和生活中接口的案例也

  • TypeScript定义接口(interface)案例教程

    接口的作用: 接口,英文:interface,其作用可以简单的理解为:为我们的代码提供一种约定. 在Typescript中是这么描述的: TypeScript的核心原则之一是对值所具有的结构进行类型检查.它有时被称做"鸭式辨型法"或"结构性子类型化". 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. 举个例子: // 定义接口 Person interface Person { name: string; age: numb

  • C#中多态现象和多态的实现方法

    本文实例讲述了C#中多态现象和多态的实现方法.分享给大家供大家参考.具体分析如下: 面向对象的特征封装.继承和多态.Polymorphism(多态性)来源于希腊单词,指"多种形态".多态性的一个重要特征是方法的调用是在运行时确定而不是编译时.在.NET中用于实现多态性的关键词有virtual.override.abstract.interface. 一.virtual实现多态   shape类是通用的基类,draw是一个虚方法,每个派生类都可以有自己的override版本,在运行时可以

  • 新手小白入门必学JAVA面向对象之多态

    目录 1. 概念 2 . 特点 3. 练习:多态入门案例 4. 多态的好处 5. 多态的使用 6. 练习:多态成员使用测试 7 拓展 7.1 设计汽车综合案例 7.2 多态为了统一调用标准 7.3 静态变量和实例变量的区别 7.4 向上转型和向下转型 总结 1. 概念 多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态. 可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,

  • JS实现消灭星星案例

    本文实例为大家分享了JS实现消灭星星的具体代码,供大家参考,具体内容如下 消灭星星的效果图: 功能需求: 1.点击星星,星星消失 2.每隔一秒自动生成一颗星星 3.星星的大小.出现位置是随机的 案例代码及分析: html和css代码: * { margin: 0; padding: 0; box-sizing: border-box; } div { position: relative; width: 1000px; height: 500px; margin: 100px auto; bac

  • Golang中Interface接口的三个特性

    原文地址 第一次翻译文章,请各路人士多多指教! 类型和接口 因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍.go是一个静态性语言,每个变量都有静态的类型,因此每个变量在编译阶段中有明确的变量类型,比如像:int.float32.MyType... 比如: type MyInt int var i int var j MyInt 变量i的类型为int,变量j的类型为MyInt,变量i.j具有确定的类型,虽然i.j的潜在类型是一样的,但是在没有转换的情况下他们之间不能相互赋值.在类型中有

  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据的思路详解

    用过 Java 的同学都熟悉 Stream API,那么在 Go 里我们可以用类似的方式处理集合数据吗?本文给大家介绍 go-zero 内置的 Stream API,为了帮助理解,函数主要分为三类:获取操作.中间处理操作.终结操作. 什么是流处理 如果有 java 使用经验的同学一定会对 java8 的 Stream 赞不绝口,极大的提高了们对于集合类型数据的处理能力. int sum = widgets.stream() .filter(w -> w.getColor() == RED) .m

  • JavaSE学习之内部类及常用API

    目录 1.内部类 1.1 内部类概述 1.2 成员内部类 1.3 局部内部类 1.4 匿名内部类 1.5 匿名内部类在开发中的使用 2.常用API 2.1Math 2.2 System 2.3 Object 2.4 Array的排序 1.内部类 1.1 内部类概述 内部类:就是在一个类中定义一个类.例如:在一个类A内部定义一个类B,类B就被称为内部类 格式:public class 类名{修饰符 class 类名{}} 范例 public class Outer{ public class In

  • 分析Go错误处理优化go recover机制缺陷

    目录 引言 语法说明 新提案 讨论 总结 引言 Go 的错误处理一直是表现最突出的一块地方,许许多多的同学都提出了各种提案,例如:引入 try-catch.用 panic 代替 if err != nil.引入新的关键字等.但这些都被一一驳回了. 不过社区依然还没放弃,周末看到有一个新的提案<proposal: runtime: add parameters to recover to only return specific types>挺有意思. 语法说明 Go 的 panic.recov

随机推荐