golang接口interface断言switchtype(代码片段)

fengchuiyizh fengchuiyizh     2023-04-19     518

关键词:

 第一大部分

 

interface 可以接受任何类型的对象值 
获取interface队形的数据类型,可以使用断言,或者 switch type 来实现

// Assertion project main.go
package main

import (
    "fmt"
)

type Bag struct 
    Key string


type Bag2 struct 
    Key int


func main() 
    var b1 interface
    var b2 interface

    b1 = BagKey: "1"
    b2 = Bag2Key: 0
    //获取interface中存放的数据类型
    //方法一:
     //判断是否是Bag类型  若不是则置0
        b, ok := b1.(Bag)
        fmt.Println("Bag类型   :", ok, "数据", b)
    
     //判断是否是Bag2类型  若不是则置0
        b, ok := b2.(Bag2)
        fmt.Println("Bag2类型:", ok, "数据", b)
    
    //方法二:
    switch v := b1.(type)  //v表示b1 接口转换成Bag对象的值
    case Bag:
        fmt.Println("b1.(type):", "Bag", v)
    case Bag2:
        fmt.Println("b1.(type):", "Bag2", v)
    default:
        fmt.Println("b1.(type):", "other", v)
    





断言:一般使用于已知interface中的对象的数据类型,调用后自动将接口转换成相应的对象,语法结构 接口对象(obj),存放的数据类型(string) ,v,ok := obj.(string),若是相应的对象ok则为真,v为相应对象及数据。

switch type: 已知或者未知的对象数据类型均可,b1.(type)必须配合switch来使用,不能单独执行此语句。 
switch v:= b1.(type)//b1为interface对象 ,v为相应对象及数据 
case Bag: //类型为Bag时执行 
     fmt.Println(“b1.(type):”, “Bag”, v) 
case Bag2://类型为Bag2时执行 
     fmt.Println(“b1.(type):”, “Bag2”, v) 
default://类型为其他类型时执行 
    fmt.Println(“b1.(type):”, “other”, v) 

 

 

 

 

第二部分 函数传参时的任意类型的接口

 

interface可用于向函数传递任意类型的变量,但对于函数内部,该变量仍然为interface类型(空接口类型)

不清楚这点将可能导致错误。如以下代码:

 

错误代码:

    package main

import "fmt"
/*
**用于输出数组元素
*/
func echoArray(a interface)
  for _,v:=range a
    fmt.Print(v," ")
  
  fmt.Println()
  return
func main()
  a:=[]int2,1,3,5,4
  echoArray(a)
//以上代码将会报错,因为对于echoArray()而言,a是interface类型,而不是[]int类型
 
 
 
正确代码
 
func echoArray(a interface)

b,ok:=a.([]int)//通过断言实现类型转换
if ok
  for _,v:=range b
    fmt.Print(v," ")
  

  fmt.Println()
  return



根据上面在函数内部转化下的形式,这样能根据ok的值判断断言是否成功。

因为断言失败在编译阶段不会报错,所以很可能出现断言失败导致运行错误,而你却迟迟找不到原因(亲身经历)。

 

1.interface使得我们可以向函数传递任意类型的变量;

2.断言解决在使用interface的情况下,空接口类型向普通类型转换的类型转换问题;

3.普通类型之间的转换最好使用显式的类型转换,否者很可能导致严重的错误。

4.以上是我个人的理解,希望各位没有被我绕糊涂 

 

接口/类型断言(代码片段)

1.定义Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。比如:typeexampleinterfaceMethod1(参数列表)返回值列表Method2(参数列表)返回值列表…2.interface类型默认是一个指针typeexampleinterfaceMethod1(参数... 查看详情

go语言接口断言(代码片段)

接口断言因为空接口interface没有定义任何函数,因此Go中所有类型都实现了空接口。当一个函数的形参是interface,那么在函数中,需要对形参进行断言,从而得到它的真实类型。语法格式://安全类型断言<目标类型的值>,<... 查看详情

类型断言的最佳实践

Golang语言中的类型断言的最佳实践利用函数typejudge来判断传入的实参是什么类型,并打印出它的类型及数值packagemainimport("fmt"_"sort"_"math/rand")typeWisdomstruct namestringfuncTypeJuDge(Items...interface) forindex,value:=rangeItems switch 查看详情

golang基础知识3

...判断的变量,T类型,例如:sss.(string),T是type最好用的是interface或者一个strcut其中var为interface{}类型T是要断言的类型。简单的string可以不使用这个1)直接断言使用vara 查看详情

golang:interface{}类型测试

在golang中空的interface即interface{}可以看作任意类型,即C中的void*.对interface{}进行类型测试有2种语法:1.Comma-ok断言:        value,ok=element.(T),       &n 查看详情

golang|既是接口又是类型,interface是什么神仙用法?

...求个关注今天是golang专题的第12篇文章,我们来继续聊聊interface的使用。在上一篇文章当中我们介绍了面向对象的一些基本概念,以及golang当中interface和多态的实现方法。今天我们继续来介绍interface当中其他的一些方法。万能类... 查看详情

golang之interface

...在一起;很多面向对象都有类似接口概念,但Golang语言中interface的独特之处在于它是满足隐形实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单拥有一些必需的就ok了;  此时,我们对于inte... 查看详情

golang-接口(interface)

Golang-接口(interface) 基本介绍    按顺序,我们应该讲解多态,但是在讲解多态前,我们需要讲解接口(interface),因为在Golang中多态特性主要是通过接口来体现的。接口快速入门  这样的设计需求在Golang编程中也是会大量存... 查看详情

golang类型断言(代码片段)

Golang类型断言目录Golang类型断言案例定义例子案例funcmain() //定义一个空接口类型 varxinterface varyfloat32=1.1 //多态 x=y //y=x错误 y=x.(float32) fmt.Println(y)定义由于接口时一般类型,不知道具体类型,如果要转为具体类型,就需要类型断... 查看详情

golang中接口interface和struct结构类的分析(代码片段)

再golang中,我们要充分理解interface和struct这两种数据类型。为此,我们需要优先理解type的作用。type是golang语言中定义数据类型的唯一关键字。对于type中的匿名成员和指针成员,这里先不讲,重点讲解interface和struct这两种特殊的... 查看详情

个人对golang的面向对象的理解------接口(interface)

...语言,但是他并没有class之类的关键字,他是通过struct和interface组合实现了面向对象的概念。转载请注明出处:http://www.cnblogs.com/SSSR/p/6351661.html在golang中面向对象的实现顺序:1.先定义struct,是对象的属性值,如:typePersonstruct{ ... 查看详情

golang的interface(代码片段)

golang的interface0.介绍接口是Go语言提供的数据类型之一,它把所有具有共性的方法(注意与函数区别开)定义在一起,任何其它类型只要一一实现这些方法的话,我们就称这个类型实现了这个接口。Go语言的接口与C++... 查看详情

golangtype和断言interface{}转换

...代你去做这个事。我之所以说通常需要手动转换,是因为interface类型作为一个特例,会有不同的处理方式。类型转换在程序设计中都是不可避免的问题。当然有一些语言将这个过程给模糊了,大多数时候开发者 查看详情

golang中any类型使用及空接口中类型查询(代码片段)

golang中Any类型使用及类型查询1.Any类型GO语言中任何对象实例都满足空接口interface,空接口可以接口任何值varv1interface=1varv2interface="abc"varv3interface=2.345varv4interface=make(map[..]...)....2.1关于空接口的类型查询方式一,使用okpacka 查看详情

go--type和断言interface{}转换

...代你去做这个事。我之所以说通常需要手动转换,是因为interface类型作为一个特例,会有不同的处理方式。类型转换在程序设计中都是不可避免的问题。当然有一些语言将这个过程给模糊了,大多数时候开发者 查看详情

golang使用接口和类型断言在go中使用任意键名解析json对象(代码片段)

查看详情

golang-interface(一基本使用)

github: https://github.com/ZhangzheBJUT/blog/blob/master/interface.md 一接口概述假设说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在现在集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基... 查看详情

golang之interface(多态)

多态用法packagemain//一种事物的多种形态,都可以按照统一的接口进行操作//多态import("fmt""math/rand""sort")typeStudentstruct{NamestringIdstringAgeintsortTypeint}typeBookstruct{NamestringAuthorstring}//切片默认传地址typeStudentArray[]Studen 查看详情