zoukankan      html  css  js  c++  java
  • 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)
    }
  • 相关阅读:
    脚本——猜拳
    脚本——基础命令
    脚本——1-100奇数的和
    脚本——判断文件类型
    脚本——判断分数是否合格
    脚本——判断服务是否开启
    脚本——ping一个网址三次
    脚本——判断是否root用户
    脚本——查看目录是否存在
    第十八天:CSV、JSON、Excel、SQLite
  • 原文地址:https://www.cnblogs.com/jiujuan/p/9000194.html
Copyright © 2011-2022 走看看