全栈编程

Balance $ 2,317
Item Sold 1230
文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!

知识大纲 【全栈编程go语言体系课】结构体知识大纲,版权@luboke.com,受法律保护。

结构体

一、结构体概述

结构体是值类型,用于自定义数据类型与实现面向对象

二、作用与应用场景

作用

  • 用于定义自定义类型

应用场景

  • 自定义数据类型
  • 面向对象

三、定义自定义类型与使用

定义自定义类型的方式1

type structVariables struct{}


type integer int
var intVariables int
var integerVariables integer
intVariables = integerVariables

//基于一种类型去创建另一种类型,被认为是两种不同的类型
fmt.Println(intVariables,integerVariables)

//无法相互赋值,如何赋值?类型转换
intVariables = int(integerVariables)

定义自定义类型的方式2 结构体

结构体字段可以是任何类型,以及结构体本身,函数,接口等等
结构体类型是某一类具体事物的抽象
以中秋节的月饼举例,月饼的模板,做出月饼
通过组合一定数据的字段来完成

 //type 结构体名 struct {
 //    field1 type1
 //    field2 type2
 //    ....
 //} 

结构体的使用方式1

type userinfo struct {
    name string
    age int
    height float32
    eduschool string
    hobby []string
    moreinfo map[string]interface{}
}

//使用
var bobo userinfo
bobo.name = "波哥"
bobo.age = 18
bobo.height = 181
bobo.eduschool = "北京邮电大学"
bobo.hobby = []string{"coding","运动","旅行"}
bobo.moreinfo = map[string]interface{}{
    "work":"百度",
    "duty":"产品狗",
}

结构体的使用方式2 :=简短声明来实现一个结构变量

第二种形式没有字段名,只声明对应的值,每个值也可以分别占一行,不过习惯上这种形式会写在一行里,结尾不需要逗号。这种形式下,值的顺序很重要,必须要和结构声明中字段的顺序一致,同时在我们不指定字段名称的时候,结构体当中的所有字段必须全部赋值

//    1.声明变量
//    2.初始化
//var liuge = userinfo{
//    name:      "",
//    age:       0,
//    height:    0,
//    eduschool: "",
//    hobby:     nil,
//    moreinfo:  nil,
//}

huge := userinfo{
        eduschool: "北京电影学院",
        hobby:     []string{"拍电影","唱歌","旅行"},
        moreinfo: map[string]interface{}{
            "role":"演员",
            "earnmoney":300000,
        },
        name:      "胡哥",
        age:       28,
        height:    188,
    }

不指定字段名的时候,需要严格的按照定义结构体时候的顺序赋值
指定字段名的时候,可以不按定义结构体时候的顺序赋值
对结构体赋值时,如果各个字段不在一行,最后一个字段必须添加逗号
对结构体赋值时,如果各个字段在同一行,则最后的一个字段可以不添加逗 号

xiaoge := userinfo{"小哥",12,120,"小学",[]string{"学习","玩","打游戏"}, map[string]interface{}{"年级":"六年级"}}
    fmt.Printf("xiaoge=%v\n",xiaoge)

对结构体赋值时,如果各个字段在同一行,则最后的一个字段可以不添加逗 号

结构体的使用方式3 new

使用new new(int),new(string),new(T) 返回结构体指针

//var t *T
//t = new(T)
var xiaoming *userinfo
xiaoming = new(userinfo)
(*xiaoming).name = "小明"
(*xiaoming).age = 12
(*xiaoming).eduschool = "北京小学"
//xiaoming->(*xiaoming) go语言编译器自动转换
xiaoming.hobby = []string{"学习","玩","打游戏"}
fmt.Println(xiaoming)

结构体的使用方式4 &地址符,同样是返回的结构体指针

    var xiaohong *userinfo = &userinfo{
        "小红",12,120,"小学",[]string{"学习","玩","打游戏"}, map[string]interface{}{"年级":"五年级"},
    }

四、结构体注意事项

不指定字段名的时候,需要严格的按照定义结构体时候的顺序赋值
1.结构体是值类型
2.结构体之间是否可以相互转换?可以转换,前提条件:具有相同的字段(个数,类型,名称)
3.结构体可以做为另一个结构体字段的类型
4.结构体变量赋值,各字段不在同一行时,最后一个字段必须加逗号
5.结构体变量赋值,各字段在同一行时,最后一个字段的逗号可加,可不加

//1.结构体是值类型
    user1 := userinfo{
        name:      "user1",
        age:       0,
        height:    0,
        eduschool: "",
        hobby:     nil,
        moreinfo:  nil,
    }
    user2 := user1
    fmt.Printf("user1 = %p,user2 = %p\n",&user1,&user2)


//2.结构体之间是否可以相互转换?可以转换,前提条件:具有相同的字段(个数,类型,名称)
user3 := userinfo{
    name:      "user3",
    age:       0,
    height:    0,
    eduschool: "",
    hobby:     nil,
    moreinfo:  nil,
}

user4 := peopleinfo{
    name:      "user4",
    age:       0,
    height:    0,
    eduschool: "",
    hobby:     nil,
    moreinfo:  nil,
    //pmoreinfo:nil,
}

user3 = userinfo(user4)
//user3 = user4
fmt.Println(user3)

五、自定义类型做为结构体字段的类型与最佳实践

结构体可以做为另一个结构体字段的类型

后台管理系统中,不同权限分配的问题

//后台管理系统中,权限问题,这里涉及了角色,超级管理员,管理员,普通用户
type role struct {
    user userinfo 
    authorization Integer  //1=超级管理员,2=管理员,3=普通用户
}


superadmin := role{
    user:          userinfo{
        name:      "超级管理员",
        age:       0,
        height:    0,
        eduschool: "",
        hobby:     nil,
        moreinfo:  nil,
    },
    authorization: 1,
}
admin := role{
    user:          userinfo{
        name:      "管理员",
        age:       0,
        height:    0,
        eduschool: "",
        hobby:     nil,
        moreinfo:  nil,
    },
    authorization: 2,
}
fmt.Println(superadmin,admin)

六、结构体在内存中的布局

结构体在内存中的布局是连续的存储空间

结构体在内存中的布局

type Rectange struct {
        x int
        y int
        z int
    }

    r := Rectange{
        x: 1,
        y: 11,
        z: 11,
    }

    fmt.Printf("x=%p,y=%p,z=%p\n",&r.x,&r.y,&r.z)

知识大纲 【全栈编程go语言体系课】结构体知识大纲,版权@luboke.com,受法律保护。

文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!
copyright © 2020 全栈编程@luboke.com