golang中接口对象的转型两种方式

接口对象的转型有两种方式:

1. 方式一:instance,ok:=接口对象.(实际类型)

  如果该接口对象是对应的实际类型,那么instance就是转型之后对象,ok的值为true
  配合if...else if...使用

2. 方式二:

  接口对象.(type)
  配合switch...case语句使用

示例:

package main

import (
    "fmt"
    "math"
)

type shape interface {
    perimeter() int
    area() int
}

type rectangle struct {
    a int  // 长
    b int  // 宽
}
func (r rectangle) perimeter() int {
    return (r.a + r.b) * 2
}
func (r rectangle) area() int {
    return r.a * r.b
}

type circle struct {
    radios int
}
func (c circle) perimeter() int {
    return 2 * c.radios * int(math.Round(math.Pi))
}
func (c circle) area() int {
    return int(math.Round(math.Pow(float64(c.radios), 2) * math.Pi))
}

func getType(s shape) {
    if i, ok := s.(rectangle); ok {
        fmt.Printf("长方形的长:%d,长方形的宽是:%d\n", i.a, i.b)
    } else if i, ok := s.(circle); ok {
        fmt.Printf("圆形的半径是:%d\n", i.radios)
    }
}

func getType2(s shape) {
    switch i := s.(type) {
    case rectangle:
        fmt.Printf("长方形的长:%d,长方形的宽是:%d\n", i.a, i.b)
    case circle:
        fmt.Printf("圆形的半径是:%d\n", i.radios)
    }
}

func getResult(s shape) {
    fmt.Printf("图形的周长是:%d,图形的面积是:%d\n", s.perimeter(), s.area())
}

func main() {
    r := rectangle{a: 10, b: 20}
    getType(r)
    getResult(r)

    c := circle{radios: 5}
    getType2(c)
    getResult(c)
}

上面的例子使用的是方式一,如果要使用方式2,可以将getType()函数改为:

func getType(s shape) {
 switch i := s.(type) {
 case rectangle:
  fmt.Printf("图形的长:%.2f,图形的宽:%.2f \n", i.a, i.b)
 case triangle:
  fmt.Printf("图形的第一个边:%.2f,图形的第二个边:%.2f,图形的第三个边:%.2f \n",i.a,i.b,i.c)
 case circular:
  fmt.Printf("图形的半径:%.2f \n",i.radius)
 }
}

PS:上面求三角形面积使用了海伦公式求三角形的面积,公式为:

三角形的面积=平方根[三角形周长的一半×(三角形周长的一半减去第一个边)×(三角形周长的一半减去第二个边)×(三角形周长的一半减去第三个边)]

到此这篇关于golang中接口对象的转型的文章就介绍到这了,更多相关golang接口对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 初步解读Golang中的接口相关编写方法

    概述 如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心. Go语言中的接口是一些方法的集合(method set),它指定了对象的行为:如果它(任何数据类型)可以做这些事情,那么它就可以在这里使用. 接口的定义和使用 比如 复制代码 代码如下: type I interface{     Get() int     Put(int)   } 这段话就定

  • golang中interface接口的深度解析

    一 接口介绍 如果说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在如今集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基石,让Go语言在基础编程哲学的探索上达到前所未有的高度.Go语言在编程哲学上是变革派,而不是改良派.这不是因为Go语言有gorountine和channel,而更重要的是因为Go语言的类型系统,更是因为Go语言的接口.Go语言的编程哲学因为有接口而趋于完美.C++,Java 使用"侵入式"接口,主要表现在实现

  • Golang 使用接口实现泛型的方法示例

    在C/C++中我们可以使用泛型的方法使代码得以重复使用,最常见例如stl functions:vector<int> vint or vector<float> vfloat等.这篇文章将使用interface{...}接口使Golang实现泛型. interface{...}是实现泛型的基础.如一个数组元素类型是interface{...}的话,那么实现了该接口的实体都可以被放置入数组中.注意其中并不一定必须是空接口(简单类型我们可以通过把他转化为自定义类型后实现接口).为什么i

  • golang分层测试之http接口测试入门教程

    前言 前几话主要讲解关于使用golang进行单元测试,在单元测试的上一层就是接口测试,本节主要讲使用golang进行接口测试,其中主要以http协议的接口测试来讲解 golang中的http请求 golang中拥有一个原生的http依赖库:net/http,http服务器的建立还是http客户端的开发,都会使用到这个依赖库,这里主要讲解时client部分,作为请求发起方应用于日常的接口测试,例示代码如下: get请求 package main import ( "fmt" "

  • 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中接口对象的转型两种方式

    接口对象的转型有两种方式: 1. 方式一:instance,ok:=接口对象.(实际类型) 如果该接口对象是对应的实际类型,那么instance就是转型之后对象,ok的值为true 配合if...else if...使用 2. 方式二: 接口对象.(type) 配合switch...case语句使用 示例: package main import ( "fmt" "math" ) type shape interface { perimeter() int area

  • ajax中data传参的两种方式分析

    本文实例讲述了ajax中data传参的两种方式.分享给大家供大家参考,具体如下: 1. POST方式: /** * 订单取消 * @return {Boolean} 处理是否成功 */ function orderCancel(orderId, commant){ var flag = false; $.ajax({ type: "POST", url: "../order/orderCancel.action", //orderModifyStatus data:

  • javascript面向对象之访问对象属性的两种方式分析

    本文实例分析了javascript面向对象之访问对象属性的两种方式.分享给大家供大家参考.具体如下: javascript面向对象的访问对象属性的两种方式.如下代码所示: 复制代码 代码如下: <script language="javascript" type="text/javascript"> function Person(){}; var p1 = new Person(); p1.name="王美人"; document.

  • Vue-Cli 3.0 中配置高德地图的两种方式

    vue 中使用高德地图有两种方式 一.vue-amap 组件 官网: https://elemefe.github.io/vue-amap/#/ 开始的时候是打算用这个组件做地图功能的,但是尝试之后存在些问题,所以就放弃了,可能是我的使用方式不对.我所遇到的问题: 1. 安装之后使用,始终提示跨域问题. 2. 页面刷新之后地图出不来,第一次进入页面时没问题.因为这两个问题所以放弃了这个组件的使用.我想可能是我哪个地方代码有问题. 二.直接引用高德地图 SDK 因为第一种方式尝试失败了,所以我选择

  • Vue中引入svg图标的两种方式

    Vue中引入svg图标的方式 Vue中引入svg图标的方式一 安装 yarn add svg-sprite-loader --dev svg组件 index.vue <!-- svg组件 --> <template> <svg class="svg-icon" :class="svgClass" aria-hidden="true"> <use :xlink:href="iconName&quo

  • 详细总结IDEA中打jar包的两种方式

    一.前言 在讲这两种方式之前,我们先来说明一下什么是java中的jar文件 jar (Java Archive File),翻译过来就是java的档案文件,它其实也类似于我们windows下的zip文件,唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的,包含了JAR包的描述信息.主类的全类名等信息. 二.不使用Maven直接打Jar包 1.File -->Project Structure -->

  • IDEA中打jar包的两种方式

    在讲这两种方式之前,我们先来说明一下什么是java中的jar文件 jar (Java Archive File),翻译过来就是java的档案文件,它其实也类似于我们windows下的zip文件,唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的,包含了JAR包的描述信息.主类的全类名等信息. 一:不使用Maven直接打Jar包. 1.File -->Project Structure -->Arti

  • SpringMVC中MultipartFile转File的两种方式

    在spring上传文件中,一般都使用了MultipartFile来接收,但是有需要用到File的地方,这里只介绍两种转为File的方法,当然也有一些其他的方法,我试了有些错误,所以就不提了: transferTo() org.apache.commons.io.FileUtils.copyInputStreamToFile() 代码如下: public void upload(@RequestParam(value = "file") MultipartFile file) {   

  • 详解在springboot中使用Mybatis Generator的两种方式

    介绍 Mybatis Generator(MBG)是Mybatis的一个代码生成工具.MBG解决了对数据库操作有最大影响的一些CRUD操作,很大程度上提升开发效率.如果需要联合查询仍然需要手写sql.相信很多人都听说过微服务,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在一个微服务的开发过程中很可能只关注对单表的操作.所以MBG在开发过程中可以快速的生成代码提升开发效率. 本文将说到在springboot的项目中如何去配置(XML形式和Java配置类形式)和使用M

  • vue中兄弟组件传值的两种方式小结

    目录 一. bus总线传值的使用 二. 使用常规的传值:(子传父,父再传子) 总结 本demo主要是为了演示vue项目中兄弟组件之间的传值,这里我演示了两种方式: a. bus总线传值: b. 我自己一般把它当成常规的传值(其实也就是子组件A传父组件,父组件再传子组 件B) 下边开始本次demo的编写: 一. bus总线传值的使用 在项目中创建一个单独的eventBus.js文件 该js文件的内容很简单,就是暴露一个vue实例而已. 有人喜欢在main.js全局引入该js文件,我一般在需要使用到

随机推荐