go语言接口实际类型 go 类型和接口

Golang入门到项目实战 | golang接口

接口像是一个公司里面的领导,他会定义一些通用规范,只设计规范,而不实现规范。

创新互联建站是一家专注于成都网站设计、成都网站制作与策划设计,香洲网站建设哪家好?创新互联建站做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:香洲等地区。香洲做网站价格咨询:13518219792

go语言的接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

语法格式和方法非常类似。

在接口定义中定义,若干个空方法。这些方法都具有通用性。

下面我定义一个USB接口,有读read和写write两个方法,再定义一个电脑Computer和一个手机Mobile来实现这个接口。

USB接口

Computer结构体

Mobile结构体

Computer实现USB接口方法

Mobile实现USB接口方法

测试

运行结果

下面我们定义一个OpenClose接口,里面有两个方法open和close,定义个Door结构体,实现其中一个方法。

为什么我不喜欢Go语言式的接口

所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等。有人觉得这个特性很好,但我个人并不喜欢这种做法,所以在这里谈谈它的缺点。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论。

我的观点:

Go的隐式接口Duck Typing确实不是新技术, 但是在主流静态编程语言中支持Duck Typing应该是很少的(不清楚目前是否只有Go语言支持).

静态类型和动态类型虽然没有绝对的好和不好, 但是每个都是有自己的优势的, 没有哪一个可以包办一切. 而Go是试图结合静态类型和动态类型(interface)各自的优势.

那么就从头谈起:什么是接口。其实通俗的讲,接口就是一个协议,规定了一组成员,例如.NET里的ICollection接口:

public interface ICollection {

int Count { get; }

object SyncRoot { get; }

bool IsSynchronized { get; }

void CopyTo(Array array, int index);

}

这就是一个协议的全部了吗?事实并非如此,其实接口还规定了每个行为的“特征”。打个比方,这个接口的Count除了需要返回集合内元素的数目以外,还隐含了它需要在O(1)时间内返回这个要求。这样一个使用了ICollection接口的方法才能放心地使用Count属性来获取集合大小,才能在知道这些特征的情况下选用正确的算法来编写程序,而不用担心带来性能问题,这才能实现所谓的“面向接口编程”。当然这种“特征”并不但指“性能”上的,例如Count还包含了例如“不修改集合内容”这种看似十分自然的隐藏要求,这都是ICollection协议的一部分。

Go语言中怎样判断数据类型

要判断数据类型,可以用Go的空接口:

建一个函数t 设置参数i 的类型为空接口,空接口可以接受任何数据类型

func t(i interface{}) {

//函数t

有一个参数i

switch i.(type) {

//多选语句switch

case string:

//是字符时做的事情

case int:

//是整数时做的事情

}

return

}

i.(type)

只能在switch中使用

这函数没有返回值,你可以自己加入

还可以用反射:

package main

import (

"fmt"

"reflect"

)

func main() {

var x float64 = 3.4

fmt.Println("type:", reflect.TypeOf(x))

}

这样就可以得出变量x的类型信息,与上面不同的是:上面的方法要先知到它是几个类型中的一个,而这个方法可以对任意对象使用


本文标题:go语言接口实际类型 go 类型和接口
标题URL:http://scyanting.com/article/hhogdd.html