golang 碎片整理之 结构体

栏目: Go · 发布时间: 4年前

内容简介:结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础。结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type)。在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样。因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位。上述代码定义了一个名为Coordinate的结构体,里面包括了两个float32的变量X,Y。该结

什么是结构体?

结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似 Java 中的class,是golang面向对象编程的基础。

结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type)。在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样。因为在 Go 语言中没有类的概念,所以在go中结构体有着很重要的地位。

如何定义一个结构体

type Coordinate struct {
    X,Y float32
}

上述代码定义了一个名为Coordinate的结构体,里面包括了两个float32的变量X,Y。该结构体可用于描述一个平面坐标。

添加对象方法

在go语言中,对象方法在结构体定义的外部添加

type Coordinate struct {
    X,Y float32
}
func (coo *Coordinate) GetCoordinate() {
    fmt.Printf("(%.2f, %.2f)\n", coo.X, coo.Y)
        return 
}

其中,func关键字后面的(coo *Coordinate),表示该函数传入一个指向Coordinate的指针,可通过指针变量coo来操作结构体的值。

几种结构体的初始化

  1. 按照原始字段顺序通过创建结构体

    package main
    import (
    "fmt"
    )
    func main(){
    p0 := Coordinate{1,2}
    p0.GetCoordinate()
    }

    输出:(1.00, 2.00),其中X=1,Y=2

2.按照自定义字段顺序进行初始化

package main
import (
    "fmt"
)
func main(){
    p0 := Coordinate{Y:1, X:2}
    p0.GetCoordinate()
}

输出:(2.00,1.00),其中X=2,Y=1

3.通过new函数创建

package main
import (
                "fmt"
)
func main(){
                p0 := new(Coordinate)
                P0.X=1
                p0.Y=2
                p0.GetCoordinate()
}

其中p0 := new(Coordinate)等价于以下写法

p3 := &Coordinate{X:1,Y:2}

p3 := &Coordinate{1,2}

比较三种创建方式,其中,第一种和第二种,p0均为一个类型为Coordinate的实例,而第三种p0为一个指向Coordinate的指针,相当于 var p0 *Coordinate = new(Coordinate)

添加值拷贝的对象方法

刚才说了,添加一个对象方法,可以通过func (t *T) functionname() 来创建,其中t是一个指针变量。我们也可以通过值拷贝的方法,添加一个对象方法,语法为 func(t T) functionname()

package main
import (
    "fmt"
)
type Coordinate struct {
    X, Y float32
}

func (coo *Coordinate) GetCoordinate() {
    fmt.Printf("(%.2f,%.2f)\n", coo.X, coo.Y)
    return
}
//值拷贝对象方法
func (coo Coordinate) SetPosition01(a float32,b float32) {
    coo.X = a
    coo.Y = b
}

//指针变量对象方法
func (coo *Coordinate) SetPosition02(a float32,b float32) {
    coo.X = a
    coo.Y = b
}
func main(){
    p0 := Coordinate{1, 2}
    fmt.Print("SetPosition02调用前:")
    p0.GetCoordinate()
    p0.SetPosition02(0, 0)
    fmt.Print("SetPosition02调用后:")
    p0.GetCoordinate()
}

输出:

SetPosition01调用前:(1.00,2.00)

SetPosition01调用后:(1.00,2.00)

SetPosition02调用前:(1.00,2.00)

SetPosition02调用后:(0.00,0.00)

从程序输出中可以看出,调用SetPosition01方法,发生了值拷贝,即使在方法内改变了coo的值,外部的p0的值没有被改变。而SetPosition02方法中,coo为指向p0地址的指针,由于是通过指针变量修改了X,Y的值,所以调用完毕后,外部p0的值会被修改为(0,0)

匿名结构体

package main
import (
    "fmt"
)
func main(){
    p_3d := struct {
            X,Y,Z float32
        }{1,2,3}
        fmt.Println("------输出p_3d--------")
        fmt.Printf("%v\n%T\n",p_3d, p_3d)
}

输出为:

-------输出p_3d-------
{1 2 3}
struct { X float32; Y float32; Z float32 }

golang构造函数

Go语言的结构体没有构造函数,我们可以自己实现。 例如,下方的代码就实现了一个person的构造函数。 因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。

func newPerson(name, city string, age int8) *person {
    return &person{
        name: name,
        city: city,
        age:  age,
    }
}

调用构造函数

p9 := newPerson("张三", "沙河", 90)

fmt.Printf("%#v\n", p9) //&main.person{name:"张三", city:"沙河", age:90}


以上所述就是小编给大家介绍的《golang 碎片整理之 结构体》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网站入侵与脚本攻防修炼

网站入侵与脚本攻防修炼

逍遥 / 2008-9 / 59.00元

《网站入侵与脚本攻防修炼》从“攻”、“防”两个角度,通过现实中的入侵实例,并结合原理性的分析,图文并茂地展现网站入侵与防御的全过程。全书共分8章,系统地介绍网站入侵的全部过程,以及相应的防御措施和方法。其中包括网站入侵的常见手法、流行网站脚本入侵手法揭密与防范、远程攻击入侵网站与防范、网站源代码安全分析与测试等。《网站入侵与脚本攻防修炼》尤其对网站脚本漏洞原理进行细致的分析,帮助网站管理员、安全人......一起来看看 《网站入侵与脚本攻防修炼》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具