Golang的结构体

结构体在Golang里面是一种比较重要的类型,也是OOP的元素的基础,基本的结构体的定义方式如下:

type Point struct {X, Y float64}

在这里面type声明一个类型的定义, Point是定义的结构体的名称, struct表示定义的是一个结构体,{X, Y float64}是元素的名称及类型。

通过嵌入结构体类型来扩展结构体

Golang结构体有一个非常不错的优点就是可以通过嵌入结构体类型来对结构体进行扩展,举个例子来说明一下:

package main

import (
    "fmt"
    "image/color"
)

type Point struct{ X, Y float64 }

type ColoredPoint struct {
    Point
    Color color.RGBA
}

func main() {
    var cp ColoredPoint
    cp.X = 1
    fmt.Println(cp.Point.X)
    cp.Point.Y = 2
    fmt.Println(cp.Y)
}

在上面的这个例子中ColoredPoint通过嵌入Point实现了元素的扩展,ColoredPoint变量可以直接通过cp.X, cp.Y访问结构体的元素,就像是访问自己的元素一样,这样写起来,包括后面参Point元素的修改都是非常方便的。

实际上不光Point的元素被引入到ColoredPoint中,Point的方法也被添加到ColoredPoint中去了,只是对方法的调用需要做一个小小的改动:

cp2.Distance(cp.Point)

这是因为方法的输入类型是Point,所以需要明确地说明传入的变量。

封装

Golang里面的结构体既然适用于OOP,自然也会支持封装的概念,实际止Golang中只有一种控制可见性的手段:大写首字母的标识符可以从定义它们的包中被导出,小写字母的则不会。在struct中情况也是一样的。

发表新评论