• Go的结构体


    结构体

    go中的结构体,就相当于面向对象的类。

    一、什么是结构体?

    结构体是用户定义的类型,表示一系列属性的集合。

    (Python中的类:一系列属性和方法的集合。)

    有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。

    例如,一个职员有 firstNamelastNameage 三个属性,而把这些属性组合在一个结构体 employee 中就很合理。

    二、结构体的声明

    语法:

    type 结构体的名字 struct {
        属性 类型
        属性 类型
        。。。
    }
    

    三、创建结构体

    1、创建有名结构体

    type Person struct {
    	name string
    	age int
    	gender int
    }
    
    func main() {
    	var p = Person{}
    	// p:=Person{}
    }
    

    2、结构体初始化

    2.1 按位置传参

    type Person struct {
    	name   string
    	age    int
    	gender int
    }
    
    func main() {
    	var p Person = Person{"donner",19,1}
    	fmt.Println(p)
    }
    
    {donner 19 1}
    

    2.2 按关键字传

    可以乱序,可以少传。

    type Person struct {
    	name   string
    	age    int
    	gender int
    }
    
    func main() {
    	var p Person = Person{gender:1,name:"donner"}
    	fmt.Println(p)
    }
    
    {donner 0 1}
    

    3、创建匿名结构体

    没有名字的结构体。需要定义在函数内部。不需要type关键字。

    只是用一次,可以把一堆属性封装到对象中。

    语法:

    var 变量名 = struct {
        属性 类型
        属性 类型
        。。。
    }{初始化传参}
    

    范例:

    func main() {
    	var obj = struct {
    		name   string
    		age    int
    		gender int
    	}{name:"noname"}
    	fmt.Println(obj)
    }
    
    {noname 0 0}
    

    四、结构体的类型

    结构体是值类型。

    结构体的类型名就是结构体的名称。

    type Person struct {
    	name   string
    	age    int
    	gender int
    }
    
    func main() {
    	var p = Person{}
    	//p:=Person{}
    	fmt.Printf("%T", p) // main.Person
    }
    

    五、结构体的默认值、

    结构体的默认值就是包含属性默认值的结构体。

    结构体属性的默认值就是属性类型的默认值。

    type Person struct {
    	name   string
    	age    int
    	gender int
    }
    
    func main() {
    	var p = Person{}
    	p.name = "donner"
    	fmt.Println(p)
    }
    
    {donner 0 0}
    

    六、访问结构体的字段

    通过点点点就可以访问。

    type Person struct {
    	name   string
    	age    int
    	gender int
    }
    
    func main() {
    	var p Person = Person{gender:1,name:"donner"}
    	fmt.Println(p.name)  // donner
    }
    

    七、结构体的指针

    var p Person = Person{gender:1,name:"donner"}
    var pPointer *Person=&p
    fmt.Println(pPointer)  // &{donner 0 1}
    fmt.Println(*pPointer)  // {donner 0 1}
    

    八、匿名字段

    只有类型,没有名字的字段。

    但是默认匿名字段的类型名就是匿名字段的名称。

    同一个类型的匿名字段只能出现一次。

    type Person2 struct {
    	string
    	int
    }
    
    // 按位置
    var p = Person2{"name",18}
    fmt.Println(p)
    
    // 按关键字(类型就是关键字)
    var p = Person2{int:18,string:"name"}
    fmt.Println(p)
    
    // 获取匿名字段的属性
    var p = Person2{int:18,string:"name"}
    fmt.Println(p.int) // 18
    

    九、嵌套结构体

    结构体嵌套结构体,即为结构体中的某个字段也是结构体。

    type Hobby struct {
    	hobbyName string
    	hobbyTime string
    }
    
    type Person3 struct {
    	name string
    	age int
    	hobby Hobby
    }
    
    // 按位置传参
    var p = Person3{"donner",18,Hobby{"rap","1year"}}
    fmt.Println(p) // {donner 18 {rap 1year}}
    
    // 按关键字自传参
    var p = Person3{name:"donner",hobby:Hobby{hobbyTime:"1year",hobbyName:"rap"},age:18}
    fmt.Println(p) // {donner 18 {rap 1year}}
    
    // 获取嵌套结构体的属性
    p.hobby.hobbyName = "篮球"
    fmt.Println(p) // {donner 18 {篮球 1year}}
    

    十、提升字段

    提升字段:如果嵌套结构体字段是一个匿名字段,那么该嵌套结构体中的字段可以被大结构体直接点出。

    type Hobby struct {
    	hobbyName string
    	hobbyTime string
    }
    
    type Person4 struct {
    	name string
    	age int
    	Hobby
    }
    
    var p = Person4{"donner",18,Hobby{"rap","1year"}}
    // 字段未提升前,需一层一层点出
    fmt.Println(p.Hobby.hobbyName)  // rap
    
    // 字段提升后,一步到位
    fmt.Println(p.hobbyName)  // rap
    

    十一、导出结构体和字段

    导出结构体(大小写)和字段(大小写)。

    如果结构体名称以大写字母开头,则它是其他包可以访问的导出类型。同样,如果结构体里的字段首字母大写,它也能被其他包访问到。

    十二、结构体相等性

    结构体是值类型。

    如果它的每一个字段都是可比较的,则该结构体也是可比较的。

    如果两个结构体变量的对应字段相等,则这两个变量也是相等的。

    如果结构体包含不可比较的字段,则结构体变量也不可比较。

  • 相关阅读:
    Opencv-Python 学习
    Python图片处理
    sae flask 微信公众平台开发
    Python 定位字符串
    Python检测IP合法 是否为公网IP
    Python requests 为pfsense 添加Routes
    lua-nginx-module 学习
    CDN 学习笔记
    教程
    2020-2021-1 20209327 《Linux内核原理与分析》第十二周作业
  • 原文地址:https://www.cnblogs.com/bowendown/p/12595115.html
Copyright © 2020-2023  润新知