最近在看一些协议的源码,其大都用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())
}

也就是说,接口可以对应拥有不同属性,相同方法的结构体。

标签: Go

添加新评论