结构体

2020-03-10  本文已影响0人  isuntong

结构体初识

package main

import "fmt"

//33
func main() {
    /*
    结构体
    */

    //方法一
    var p1 Person
    fmt.Println(p1) //{ 0  }
    p1.name = "王二狗"
    p1.age = 30
    p1.sex = "男"
    p1.address = "长春"
    //姓名:王二狗,年龄:30,性别:男,地址:长春
    fmt.Printf("姓名:%s,年龄:%d,性别:%s,地址:%s\n",p1.name,p1.age,p1.sex,p1.address)

    //方法二
    p2 := Person{}
    p2.name = "st"
    p2.age = 22
    p2.sex = "女"
    p2.address = "北京"
    // 姓名:st,年龄:22,性别:女,地址:北京
    fmt.Printf("姓名:%s,年龄:%d,性别:%s,地址:%s\n",p2.name,p2.age,p2.sex,p2.address)

    //方式三
    p3 := Person{name:"如花",age:20,sex:"女",address:"杭州"}
    fmt.Println(p3) //{如花 20 女 杭州}

    //隔行写
    p4 := Person{
        name:    "老王",
        age:     60,
        sex:     "男",
        address: "武汉",
    }
    fmt.Println(p4) //{老王 60 男 武汉}

    //方法四
    p5 := Person{"李小花",20,"女","成都"}
    fmt.Println(p5) //{李小花 20 女 成都}

}

//1. 定义结构体
type Person struct {
    name string
    age int
    sex string
    address string
}


结构体指针

package main

import "fmt"

//34
func main() {
    /*
    结构体指针

    数据类型:
        值类型:int、float、bool、string、array、struct

        引用类型:slice、map、function、pointer
    */
    p1 := Person1{"李小花",20,"女","成都"}
    fmt.Println(p1)
    fmt.Printf("%p,%T\n",&p1,p1) //0xc000038040,main.Person

    p2 := p1
    fmt.Println(p2)
    fmt.Printf("%p,%T\n",&p2,p2) //0xc000038100,main.Person

    p2.name = "王二狗"
    fmt.Println(p2) //{王二狗 20 女 成都}
    fmt.Println(p1) //{李小花 20 女 成都}


    //定义结构体指针
    var pp1 *Person1
    pp1 = &p1
    fmt.Println(pp1)
    fmt.Printf("%p,%T\n",pp1,pp1) //0xc000038040,*main.Person1
    fmt.Println(*pp1) //{李小花 20 女 成都}

    (*pp1).name = "李四"
    pp1.name = "王五"


    //make new
    //使用内置函数new(),它是go语言中专门用于创建某种类型的指针的函数
    //不是nil,空指针,指向了分配的类型的内存,里面存储的零值
    pp2 := new(Person1)
    fmt.Printf("%T\n",pp2)
    pp2.name = "赵六"
    fmt.Println(*pp2)



}

type Person1 struct {
    name string
    age int
    sex string
    address string
}

结构体的匿名字段

package main

import "fmt"

//35
func main() {
    /*
    结构体的匿名字段

        匿名结构体;没有名字的结构体
            变量名 := struct {
                定义字段Field
            }{
                //赋值
            }

    */

    s1 := Student{name:"张三",age:18}
    fmt.Println(s1) //{张三 18}

    //匿名函数
    func (){
        fmt.Println("hello") //hello
    }()

    //匿名结构体
    s2 := struct {
        name string
        age int
    }{
        name:"李四",
        age:19,
    }

    fmt.Println(s2) //{李四 19}

    //使用匿名字段
    w2 := Worker{"小花",32}
    fmt.Println(w2) //{小花 32}

}

//匿名字段  匿名字段不能重复,否则会冲突
type Worker struct {
    string //匿名字段 默认使用数据类型作为名字
    int
}


type Student struct {
    name string
    age int
}

结构体嵌套

package main

import "fmt"

//36
func main() {
    /*
    结构体的嵌套:一个结构体的字段是另一个结构体
    */

    b1 := Book{"西游记",45.8}

    s1 := Student1{
        name: "王二狗",
        age:  18,
        book: b1,
    }

    fmt.Println(b1)
    fmt.Println(s1)

    fmt.Printf("学生姓名:%s,学生年龄:%d," +
        "看的书是:《%s》,书的价格:%.2f\n",s1.name,s1.age,s1.book.bookName,
        s1.book.price) //学生姓名:王二狗,学生年龄:18,看的书是:《西游记》,书的价格:45.80

    //值传递
    b1.bookName = "红楼梦"
    fmt.Println(b1) //{红楼梦 45.8}
    fmt.Println(s1) //{王二狗 18 {西游记 45.8}}

}

type Book struct {
    bookName string
    price float64
}

type Student1 struct {
    name string
    age int
    book Book
}

Go语言中的OOP

package main

import "fmt"

//37
func main() {
    /*
        Go语言中的oop
            1. 模拟继承性
                type A struct {
                    field
                }
                type B struct {
                    A //匿名字段
                }

    2. 模拟聚合关系
        type C struct{
            field
        }
        type D struct {
            c C //聚合关系
        }

    */
    //1. 创建父类对象
    p1 := Person2{
        name: "张三",
        age:  30,
    }
    fmt.Println(p1)

    //2. 创建子类对象
    s1 := Student2{
        Person2: Person2{
            name: "李四",
            age:  18,
        },
        school:  "东北大学",
    }
    fmt.Println(s1)

    var s3 Student2
    s3.Person2.name = "王五"
    s3.Person2.age = 19
    s3.school = "清华"
    fmt.Println(s3)

    //提升字段 简写
    //Student结构体将Person结构体作为了一个匿名字段了,那么Person中的字段,对于Student
    //来说,就是提升字段,student对象能直接访问
    s3.name = "赵六"
    s3.age = 50
    s3.school = "门头沟"
    fmt.Println(s3)

}

//定义父类
type Person2 struct {
    name string
    age int
}

//定义子类
type Student2 struct {
    Person2 //模拟继承结构
    school string //子类新增属性
}
上一篇下一篇

猜你喜欢

热点阅读