关键词:
第一大部分
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 查看详情