文档章节

结构体(Struct)和接口(Interface)

烈冰
 烈冰
发布于 2012/11/14 00:22
字数 814
阅读 490
收藏 2
点赞 1
评论 0

定义Struct

//定义类型
//首字母大写则在其他包中可见,否则只能在当前包中使用
type Point struct {
  x, y float64
}

//声明变量
p := Point{} //用零值初始化
p0 := new(Point)//和上面的一样
var p1 Point = Point{3,4}  // 值
var p2 Point = Point{x:1}// 指定字段名来初始化值,x==3,y==0
var p2 *Point = &Point{3,4} // 返回指针

//如果省略字段的名字,可以创建匿名字段,例如:
//匿名字段一般用于嵌入另一个类型,以实现组合和委派
//a的变量可以直接访问T1、T2、T3的方法
type a struct{
	T1   //字段名字是 T1
	*T2   //字段名字是 T2
	P.T3   //字段名字是 T3
	x,y int   //字段名字是 x 和 y
}

Struct方法

//方法名前面加上Struct名称来标记该函数是Point的方法
//当使用值类型来定义时,会复制一个新的对象
//因此在方法里对struct的修改不会影响到方法外的对象
func (self Point) Length() float {
  //该方法中不会对外部的Point产生影响
  return math.Sqrt(self.x*self.x + self.y*self.y);
}

//使用指针类型来定义方法
//方法中的Point是指针,因此方法中会影响外部的Point
func (self *Point) Scale(factor float64) {
  self.x = self.x * factor
  self.y = self.y * factor
}

定义接口

对于只有一个方法的接口通常用方法名+er的方式来命名

type Abser interface {
	Abs() float64
}

实现接口

Go无需像java那样显式的声明implement了哪个接口,任何实现了接口全部方法的类型就相当于实现了该接口

//实现接口的可以是任何类型,比如:
//自定义一个float类型,并实现接口
type MyFloat float64

func (f MyFloat) Abs() float64 {
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}

//定义一个struct并实现接口
type Vertex struct {
	X, Y float64
}

//注意用指针定义方法时与上个例子的区别:
//*Vertex 实现了接口Abser,但Vertex就没有实现接口
func (v *Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

需要特别指出的很重要的一点就是所有的对象都实现了这个空接口

interface {}

因此可以定义接受任何类型的变量

func g(obj interface{}) int{
	return obj.(I).Get()//把obj转换成I类型的接口
}

运行时判断类型

//(type)只能在switch中使用
switch i := x.(type) {
	case nil:
		printString("x is nil")
	case int:
		printInt(i)  // i is an int
	case float64:
		printFloat64(i)  // i is a float64
	case func(int) float64:
		printFunction(i)  // i is a function
	case bool, string:
		printString("type is bool or string")  // i is an interface{}
	default:
		printString("don't know the type")
}

//另一种等价的写法
v := x  // x is evaluated exactly once
if v == nil {
	printString("x is nil")
} else if i, isInt := v.(int); isInt {
	printInt(i)  // i is an int
} else if i, isFloat64 := v.(float64); isFloat64 {
	printFloat64(i)  // i is a float64
} else if i, isFunc := v.(func(int) float64); isFunc {
	printFunction(i)  // i is a function
} else {
	i1, isBool := v.(bool)
	i2, isString := v.(string)
	if isBool || isString {
		i := v
		printString("type is bool or string")  // i is an interface{}
	} else {
		i := v
		printString("don't know the type")  // i is an interface{}
	}
}

//当然也可以判断接口变量实际是哪种类型
if t,ok:=I.(Abser);ok {
	//如果I的实际类型是Abser,则ok为true
   //并把I转换成Abser赋给t
}

//如果可以肯定I就是Abser就可以简单地写
t := I.(Abser)

© 著作权归作者所有

共有 人打赏支持
烈冰
粉丝 49
博文 38
码字总数 8414
作品 1
佛山
程序员
Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义...

xumaojun ⋅ 03/12 ⋅ 0

【go语言】读书随笔

在结构体中如果一个字段声明只有类型而没有指定名称,则这个字段叫做匿名字段。匿名字段的类型必须由一个数据类型的名称(比如int、string、Sortable等)或者一个非接口类型对应的指针类型的...

qingkechina ⋅ 2017/02/15 ⋅ 0

Linux USB驱动框架分析

Linux USB驱动框架分析(一) 事实上,Linux的设备驱动都遵循一个惯例——表征驱动程序的结构体,结构体里面应该包含了驱动程序所需要的所有资源。用术语来说,就是这个驱动器对象所拥有的属...

nothingfinal ⋅ 2012/05/27 ⋅ 0

Golang 匿名结构体及测试代码编写技巧

这两天在学习 Golang 如何 TDD ,了解到匿名结构体切片在 TableDrivenTests 中经常用到。 Writing good tests is not trivial, but in many situations a lot of ground can be covered with ......

hww_面条酱 ⋅ 2017/11/08 ⋅ 0

C语言面向对象编程(四):面向接口编程

Java 中有 interface 关键字,C++ 中有抽象类或纯虚类可以与 interface 比拟,C 语言中也可以实现类似的特性。 接口和抽象类有什么区别? 很多编程书籍也经常说要面向接口编程,我的理解是,...

follitude ⋅ 2016/05/04 ⋅ 0

[翻译] effective go 之 Embedding

Embedding Go does not provide the typical, type-driven notion of subclassing, but it does have the ability to “borrow” pieces of an implementation by embedding types within a ......

pengfei_xue ⋅ 2013/02/23 ⋅ 0

Linux设备模型(总线、设备、驱动程序和类)

之一:bus_type 总线是处理器和一个或多个设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟"platform"总线。可以通过ls -l /sys/bus看到系统加载的所有总线。 dr...

sflfqx ⋅ 2013/03/08 ⋅ 0

Go语言规范(类型与值的属性)

原文:http://golang.org/doc/gospec.html Properties of types and values 类型和值的属性 Two types are either identical or different, and they are either compatible or incompatibl......

曾赛 ⋅ 2010/04/27 ⋅ 0

USB 设备驱动开发之几个重要结构体分析

 该部分所有结构体的声明均可以在内核源文件 usb.h 内找到,有兴趣的朋友可以阅读源码。   USB设备其实很复杂,但是Linux内核提供了一个称为USB core的子系统来处理了大部分的复杂工作,所...

lxllinux ⋅ 03/05 ⋅ 0

【Go语言】【15】GO语言的面向对象

GO是不是面向对象的语言? GO作者如是说:“是,也不是。” 正如前面所说:GO是一种面向类型的语言,它有类型和方法,但没有类的概念,程序员可以用一种面向对象的风格(或者说是方式)来编程...

qingkechina ⋅ 2015/07/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿“德州扒鸡”...

python玩家 ⋅ 10分钟前 ⋅ 0

MySQL 内核深度优化

MYSQL数据库适用场景广泛,相较于Oracle、DB2性价比更高,Web网站、日志系统、数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务...

java高级架构牛人 ⋅ 32分钟前 ⋅ 0

用户登录信息-钉子效果(基于jquery2.0)

本js效果使用jquery2.0,清晰的分解用户登录信息的(钉子效果),该效果直接用在作者网站(www.phpkhbd.com)上。 里面的难点有:定时器,延时。 大致效果如下: 一开始: 鼠标放上去的时候:...

宁哥实战课堂 ⋅ 34分钟前 ⋅ 0

解决yum安装报错Protected multilib versions

使用yum安装报错Protected multilib versions原因是因为多个库不能共存,不过更新的话也并不行,但是可以在安装命令后面加上如下一段命令: --setopt=protected_multilib=false 案例: 比如需...

北岩 ⋅ 45分钟前 ⋅ 0

为什么要学习Typescript???

简单来说 目前的typescript就是未来的javascript 为什么?? 这要从ECMA-262标准的第4版说起 对了 我们说的ES5 其实是ECMAScript3.1这个替代性建议被扶正了而已... 那么 第4版标准是什么? 看看...

hang1989 ⋅ 49分钟前 ⋅ 0

linux安装ipfs

一、下载ipfs # cd /usr/local/ipfs/ # wget https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz # tar -zxvf go-ipfs_v0.4.15_linux-amd64.tar.gz 二、安装ipfs # ......

八戒八戒八戒 ⋅ 55分钟前 ⋅ 0

jvm程序执行慢诊断手册

生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步。...

xpbob ⋅ 55分钟前 ⋅ 0

YII2 advanced 高级版本项目搭建-添加API应用以及多应用

一、YII安裝 安裝yii可以用composer安裝,也可以在yii中文社区下载归档文件安装 composer安装就不介绍了,因为要安装composer,比较麻烦,当然安装了composer是最好的,以后安装yii的插件要用...

botkenni ⋅ 56分钟前 ⋅ 0

在jdk1.8的环境下模拟永久代内存溢出

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space 1、通过List不断添加String.intern(); 2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到...

虾几把写 ⋅ 今天 ⋅ 0

开发OpenDaylight组件的完整流程

在前面介绍学习了OpenDaylight的几个重要模块后,这里再来介绍下完整开发一个模块的过程。 OSGI的bundles提供被其他OSGI组件调用的服务。这个教程中展示的是Data Packet Service去解析数据包...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部