golang 接口interface{}、断言、switch type

第一大部分

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 = Bag{Key: "1"}
    b2 = Bag2{Key: 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:=[]int{2,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.以上是我个人的理解,希望各位没有被我绕糊涂 

原文地址:https://www.cnblogs.com/fengchuiyizh/p/12297748.html

时间: 2024-11-09 07:59:59

golang 接口interface{}、断言、switch type的相关文章

golang中接口interface和struct结构类的分析

再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和指针成员,这里先不讲,重点讲解interface和struct这两种特殊的数据类型. interface和struct也是数据类型,特殊在于interface作为万能的接口类型,而struct作为常用的自定义数据类型的关键字.说到这里相比大家已经明白interface的侧重点在于接口的定义(方法),

golang中interface接口的深度解析

什么是interface,简单的说,interface是一组method的组合,下面这篇文章主要给大家深度解析了关于golang中的interface接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 一 接口介绍 如果说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在如今集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基石,让Go语言在基础编程哲学的探索上达到前所

Golang-interface(二 接口与nil)

github: https://github.com/ZhangzheBJUT/blog/blob/master/nil.md 一 接口与nil 前面讲解了go语言中接口的基本使用方法,下面将说一说nil在接口中的使用. 从上面一节我们知道在底层,interface作为两个成员实现:一个类型和一个值.该值被称为接口的动态值, 它是一个任意的具体值,而该接口的类型则为该值的类型.对于 int 值3, 一个接口值示意性地包含(int, 3). 只有在内部值和类型都未设置时(nil, nil),一个接

Golang-interface(一 基本使用)

github: https://github.com/ZhangzheBJUT/blog/blob/master/interface.md 一 接口概述 如果说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在如今集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基石,让Go语言在基础编程哲学的探索上达到前所未有的高度. Go语言在编程哲学上是变革派,而不是改良派.这不是因为Go语言有gorountine和channel,而更重要的是因为Go

Golang-interface(四 反射)

github:https://github.com/ZhangzheBJUT/blog/blob/master/reflect.md 一 反射的规则 反射是程序运行时检查其所拥有的结构,尤其是类型的一种能力:这是元编程的一种形式.它同时也是造成混淆的重要来源. 每个语言的反射模型都不同(同时许多语言根本不支持反射).本节将试图明确解释在 Go 中的反射是如何工作的. 1. 从接口值到反射对象的反射 在基本的层面上,反射只是一个检查存储在接口变量中的类型和值的算法.在 reflect 包中有两个类

go语言之行--接口(interface)、反射(reflect)详解

一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: interface是方法的集合 interface是一种类型,并且是指针类型 interface的更重要的作用在于多态实现 interface定义 type 接口名称 interface { method1 (参数列表) 返回值列表 method2 (参数列表) 返回值列表 ... } interf

go面向对象之多态即接口(interface)

1.go语言的多态是用接口来实现的interface package main import "fmt" //面向对象的多态是通过接口interface来实现的,不同的对象,调用相同的接口,实现不同的效果 //go语言中,接口interface是一个自定义类型,描述了一系列方法的集合,关键字interface //接口不能被实例化 //定义接口的方法 //type 接口名字 interface { // //} //接口的名字一般以er结尾 //定义一个Personer的接口 type

Golang 接口与反射知识要点

目录 Golang 接口与反射知识要点 1. 接口类型变量 2. 类型断言 3. 鸭子类型 4. 反射机制 5. reflect 包 TypeOf().ValueOf() Type().Kind() Interface() 6. 反射对象的可设置性 SetXXX(), CanSet() Elem() 7. Struct 的反射 NumField(), Type.Field(i int) Value.Field(i int) 参考文档 Golang 接口与反射知识要点 这篇文章以 Go 官方经典博

Golang中interface{}作为函数参数和函数返回值的使用

package main import (     "errors"     "fmt" ) type item struct {     Name string } func (i item) String() string {     return fmt.Sprintf("item name: %v", i.Name) } type person struct {     Name string     Sex  string } func