Golang的高级数据类型-结构体(struct)实战篇

        Golang的高级数据类型-结构体(struct)实战篇

                             作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

   前面我们介绍了数组,切片,map同名都是用来保存相同的数据类型的,那如果我们想要一种数据类型保存不同类型的数据咋办呢?Go语言在结构体中可以为不同项定义不同的数据类型。

 

一.定义结构体

package main

import (
    "fmt"
)

/*
    我们定义一个变量后不使用运行会报错,但定义结构体类型后可以不使用,在执行时并不会报错,因为你不对结构体进行初始化操作它并不占用内存空间.
*/
type Teacher struct {
    Name string
    Age  uint8
}

/*
    温馨提示:
        Go语言中结构体的字段首字母如果小写的话不能跨包访问,如果首字母大写则可以跨包访问.

    如下所示,我们可以自定义一个全局类型的Student结构体类型
*/
type Student struct {
    Name   string
    Age    uint8
    Gender rune
}

func main() {
    //初始化一个结构体
    var s1 Student
    s1.Name = "尹正杰"
    s1.Age = 18
    fmt.Println("s1 = ", s1)

    //我们也可以在声明变量的时候定义结构体类型,只不过我们实在main函数声明的,因此是一个局部变量
    var s2 struct {
        Name  string
        Score int
    }
    s2.Name = "Jason Yin"
    s2.Score = 750
    fmt.Println("s2 = ", s2)

    //我们可以直接进行初始化赋值
    s3 := Student{Name: "Yinzhengjie", Age: 27, Gender: ''}
    s4 := Student{"尹正杰", 27, ''} //可以省略字段名称但顺序一定不能错
    fmt.Println("s3 = ", s3)
    fmt.Println("s4 = ", s4)
}

  

二.结构体的基本使用

1>.结构体的访问方式

package main

import (
    "fmt"
)

/*
    温馨提示:
        (1)结构体中的字段一旦定义就不会发生改变;
        (2)结构体没有增加或者删除字段的操作;
        (3)在main函数中调用其它文件的成员,在编译运行的时候,必须手动指定编译的文件;

*/
type Person struct {
    Name string
    Age  uint8
}

func main() {

    //对自定义的结构体进行初始化赋值
    s := Person{"尹正杰", 18}

    fmt.Println(s)

    //我们可以单独访问结构体的元素
    fmt.Printf("姓名:%s,年龄:%d\n", s.Name, s.Age)
}

2>.结构体和切片结合使用

package main

import (
    "fmt"
)

type Operation struct {
    Name string
    Age  uint8
}

func main() {
    //使用自动推导类型直接进行初始化赋值
    op := Operation{"尹正杰", 18}
    fmt.Println("op的数据为:", op)

    //定义一个结构体切片
    var s1 []Operation

    //对结构体切片进行初始化
    s1 = make([]Operation, 3)

    fmt.Print("s1结构体初始化值为:")
    fmt.Println(s1)
    //对结构体切片第二个元素进行赋值
    s1[1] = op
    //我们可以对结构体切片的元素对应的属性进行修改操作
    s1[1].Name = "Jason Yin"
    fmt.Print("s1结构体被修改后的值为:")
    fmt.Println(s1)
}

3>.结构体和字典(map)结合使用

package main

import (
    "fmt"
)

type Server struct {
    brand       string //品牌
    CpuCore     uint8  //核心数
    MemorySpace int    //内存空间,单位为GB
    DiskSpace   int    //磁盘空间,单位为GB
}

func main() {
    //使用自动推导类型直接进行初始化赋值
    s1 := Server{"戴尔", 32, 128, 122880}

    //定义一个字典
    m1 := make(map[string]Server)

    //结构体对象作为map的value
    m1["亦庄机房"] = s1
    fmt.Println(m1["亦庄机房"].brand)
    fmt.Println(m1)

    /*
       如果map的value是结构体类型,那么不能直接通过map修改结构体中的数据,这个时候结构体的内容是只读的.
       如果非要修改map的value是结构体类型,需要先对结构体进行修改,然后再重新赋值
    */
    //m1["亦庄机房"].brand = "浪潮" //这种写法是错误的
    s1.brand = "浪潮" //先修改s1结构体的brand字段
    m1["亦庄机房"] = s1 //再对同一个key进行赋值,完成更新操作
    fmt.Println(m1["亦庄机房"].brand)
    fmt.Println(m1)
}

 

 三.结构体对象作为函数参数传递

package main

import "fmt"

type Car struct {
    Name  string
    color string
    tyre  int8
}

func Demo(c Car) {
    c.color = "红色"
    fmt.Println("in Demo ...", c)
}

func main() {

    d1 := Car{"特斯拉", "蓝色", 4}
    fmt.Println("in main ...", d1)

    /*
        结构体对象作为函数参数,是值传递
    */
    Demo(d1)

    fmt.Println("in main ...", d1)
}

 

posted @ 2020-02-19 23:28  JasonYin2020  阅读(2153)  评论(0编辑  收藏  举报