zoukankan      html  css  js  c++  java
  • 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
    ", 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)
    }

  • 相关阅读:
    google搜索引擎使用方法
    通过Ajax和SpringBoot交互的示例
    利用html sessionStorge 来保存局部页面在刷新后回显,保留
    JS页面刷新保持数据不丢失
    Firefox浏览器中,input输入框输入的内容在刷新网页后为何还在?
    关于form/input 的autocomplete="off"属性
    Java对日期Date类进行加减运算,年份加减,月份加减
    select标签设置只读的方法(下拉框不可选但可传值)
    用Thymeleaf在前台下拉列表取值
    jsp页面动态展示list-使用<select>和<c:forEach>标签
  • 原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12333875.html
Copyright © 2011-2022 走看看