Go中的结构体与接口
最近在看一些协议的源码,其大都用Go语言实现,遂了解一下Go语言的基本数据结构。
编程思想有很多,例如面向过程的C、面向对象的C++和JAVA等,而Go相较于C多了接口、相较于JAVA少了类,好像一种半面向对象的编程方法。
1、结构体
Go语言中数组可以存储同一类型的数据,但在结构体中可以为不同项定义不同的数据类型。
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。
下面是一个具体示例:
package main
import (
"fmt"
)
//定义一个结构体
type Student struct {
//定义结构体的属性
Name string
Age int
}
func main() {
//实例化一个结构体
var a Student
//为实例a的属性赋值
a.Name="Alice"
a.Age=22
fmt.Println(a)
//实例化b并赋值
b:=Student{"Bob",24}
fmt.Println(b)
}结构体是由变量组成的,其中并不包含方法,即纯粹的数据属性。
2、接口
Go语言中的接口(interface)用于定义方法的集合,它通过描述类型(type,大多是struct,也可是其他,这里只讨论struct)必须实现的方法,规定了类型的行为契约。
Go的接口与JAVA最大的区别在于,Go是由结构体隐式的实现某个接口,如果一个结构体满足了某个接口定义的所有方法,那么这个结构体就实现了该接口。而JAVA中则是由类显式的实现某个接口,并实现该接口的所有功能。
下面是一个示例:
package main
import (
"fmt"
)
//定义一个结构体
type Student struct {
//定义结构体的属性
Name string
Age int
}
//声明一个接口
type Action interface {
//声明接口的方法
Introduction() string
ChangeInfo(name string,age int)
}
//定义结构体的方法,以实现接口
//func (方法接收者) 方法名(参数) 返回值
func (s Student) Introduction() string {
mystr:=fmt.Sprintf("My name is %s, my age is %d",s.Name,s.Age)
return mystr
}
//这里传递指针,否则不会改变值
func (s *Student) ChangeInfo(name string,age int){
s.Name=name
s.Age=age
}
//定义另一个结构体
type Teacher struct {
Name string
Age int
Object string
}
//定义Teacher结构体的方法,以满足接口
func (t Teacher) Introduction() string {
mystr:=fmt.Sprintf("My name is %s, my age is %d, my object is %s",t.Name,t.Age,t.Object)
return mystr
}
func (t Teacher) ChangeInfo(name string,age int) {
//不用该函数,但必须定义,否则无法满足接口需求
}
func main() {
//实例化一个结构体
var a Student
//为实例a的属性赋值
a.Name="Alice"
a.Age=22
fmt.Println(a)
//实例化b并赋值
b:=Student{"Bob",24}
fmt.Println(b)
//声明接口
var i Action
//由于定义了指针类型的方法,所以接口赋值时要用指针
i=&a
fmt.Println(i.Introduction())
//调用方法修改结构体属性值
i.ChangeInfo("New Bob",22)
//实例化一个教师结构体
c:=Teacher{"Mike",50,"English"}
//赋值给接口
i=c
fmt.Println(i.Introduction())
}
也就是说,接口可以对应拥有不同属性,相同方法的结构体。