Golang基础(4):Go结构体

当我们要表示同一种数据类型时候,可以用到数组,切片和字典。 当我们要表示不同的数据类型呢?这时候就要用到结构体了

一:定义struct

关键字 type 和 struct 来定义结构体

type student struct {
    name string
    age int
}

二:struct赋值

var stu student
stu.name = "Tom"
stu.age = 10
fmt.Printf("name %s, age: %d", stu.name, stu.age)

除了上面,还有下面几种方式:

1.提供顺序初始化
stu := person{"Tom", 20}
2.通过field:value的方式初始化,可以是任意顺序
stu := person{"age":20, "name":"Tom"}
3:也可以通过new分配指针
stu := new(person)

完整例子:

package main

import "fmt"

type person struct {
    name string
    age  int
}

func main() {
    var stu person
    //赋值初始化
    stu.name, stu.age = "Tom", 23

    //根据field:value初始化
    jimmy := person{age: 34, name: "jimmy"}

    //按照顺序初始化
    mike := person{"mike", 23}

    fmt.Println(stu.name, jimmy.name, mike.name, jimmy.age, mike.age)
}

三:结构体传递参数

package main

import "fmt"

//结构体传递参数
type Rect struct {
    with, length float64
}

func double_area(rect Rect) float64 {
    rect.with *= 2
    rect.length *= 2
    return rect.with * rect.length
}

func main() {
    var rect = Rect{20, 30}
    area := double_area(rect)
    fmt.Println(area)
}

四:结构体函数

上面我们在main函数计算了双倍矩形面积,但是double_area不能作为 Rect 的方法实现,而是将Rect对象作为参数传给了函数计算,还有没有其他方法实现呢,当然有

package main

import "fmt"

type Rect struct {
    with, length float64
}

func (r Rect) double_area() float64 {
    r.with *= 2
    r.length *= 2
    return r.with * r.length
}

func main() {
    var rect = Rect{20, 30}
    fmt.Println(rect.double_area())
}

五:  结构体内嵌类型

我们可以在一个结构体内部定义一个结构体类型的成员

package main

import "fmt"

type Phone struct {
    price int
    color string
}

type IPhone struct {
    phone Phone
    model string
}

func main() {
    var p IPhone
    p.phone.price = 5000
    p.phone.color = "red"
    p.model = "ipone 6s"
    fmt.Println("Price:", p.phone.price)
    fmt.Println("Color:", p.phone.color)
    fmt.Println("Model:", p.model)
}

六:struct匿名字段

上面我们定义了一个嵌套结构体, 实际上go也提供一种不写名字嵌套的结构体,也就是匿名字段

package main

import "fmt"

type Phone struct {
    price int
    color string
}

type IPhone struct {
    Phone  //匿名字段,那么默认IPhone就包含了Phone所有字段
    model string
}

func main() {
    var p IPhone
    p.Phone.price = 7000   //直接 p.Phone.price 赋值
    p.Phone.color = "glod"
    p.model = "ipone 7p"
    fmt.Println("Price:", p.Phone.price)
    fmt.Println("Color:", p.Phone.color)
    fmt.Println("Model:", p.model)
}

 

posted @ 2016-08-21 22:53  九卷  阅读(387)  评论(0编辑  收藏  举报