文档章节

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

烈冰
 烈冰
发布于 2012/11/14 00:22
字数 814
阅读 2.1K
收藏 2

阿里云携手百名商业领袖、技术大咖,带您一探行进中的数字新基建!>>>

定义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)

© 著作权归作者所有

上一篇: maven3笔记
下一篇: Map
烈冰

烈冰

粉丝 54
博文 39
码字总数 8933
作品 1
佛山
架构师
私信 提问
加载中

评论(0)

Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

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

xumaojun
2018/03/12
0
0
GO语言系列(五)- 结构体和接口

结构体(Struct) Go中struct的特点 1. 用来自定义复杂数据结构 2. struct里面可以包含多个字段(属性) 3. struct类型可以定义方法,注意和函数的区分 4. struct类型是值类型 5. struct类型...

osc_yw54cj9c
2019/04/07
3
0
Go语言学习之5 进阶-排序、链表、二叉树、接口

本节主要内容: 1. 结构体和方法 2. 接口 1. 结构体和方法 (1). 用来自定义复杂数据结构 (2). struct里面可以包含多个字段(属性) (3). struct类型可以定义方法,注意和函数的区分 (4). str...

osc_f8mjcido
2019/02/18
2
0
golang结构体、接口、反射

struct结构体 struct用来自定义复杂数据结构,可以包含多个字段属性,可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型. struct定义 struct使用...

osc_e3nle85o
2018/08/29
0
0
interface作为struct field,谈谈golang结构体中的匿名接口

golang中通过组合(composite)实现类似继承(extends)和重写(override)的功能,大家可能平时用的比较多的是struct中匿名struct的写法,有没有见过struct中匿名接口(anonymous interface)的写法...

wind5o
2019/09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot 整合 Redis 缓存

1.首先导入使用Maven导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><......

FH-Admin
42分钟前
12
0
如何安装WordPress插件 - 初学者的分步指南 - WP站长

<!-- wp:paragraph -->安装WordPress后,每一个初学者需要学习的第一件事就是如何安装WordPress插件。插件允许您向WordPress添加新功能,例如添加图库、幻灯片等。有数千个可用于WordPress的...

wpzhanzhang
57分钟前
8
0
【Flutter组件终结篇】332个组件 658页PDF

老孟导读:历时1年的时间,整理完成了330+组件的详细用法,不仅包含UI组件,还包含了功能性的组件。 虽然整理了 330+的组件基本用法,但并不是让你每一个都学习一遍,任何技术基本都是掌握 ...

老孟Flutter
今天
17
0
三星手机又中招:一张壁纸可引发系统崩溃 附临时解决方法

  前几天国内有大量用户发现三星手机崩溃、黑屏或者无限重启, 这可能是三星手机的日历 APP 的 bug。这件事还没完,三星手机今天又发现了新的问题,换上一张特别的壁纸就会导致系统崩溃,不...

alkcendkljk
今天
13
0
查找当前目录和文件目录[重复] - Find current directory and file's directory [duplicate]

问题: This question already has answers here : 这个问题已经在这里有了答案 : How to properly determine current script directory? 如何正确确定当前脚本目录? (11 answers) (11个答...

技术盛宴
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部