【GO语言学习 基础篇】08 结构体

源代码

go语言基础


结构体

创建新的结构体 直接就是指针类型的,给函数传一个结构体,那么就不需要传指针类型的了,要深入了解一下。

结构体可以有自己的方法

Json 是可以和结构体相互转换的,这个会在后面说到。

结构体函数(想不起来叫啥了,自己编的,希望对),这个要注意以下,用法很多,建议结合代码食用。
func (s 某结构体) xxx(){}

  • 结构体

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    // 类似于java中的类 这个更加清晰
    type person struct {
        name  string
        age   int
        hight int
    }
    
    type person2 struct {
        name       string
        age, hight int
    }
    
    // 匿名字段 只给类型不命名字段 每个类型只能有一个
    type person3 struct {
        string
        int
    }
    
    // 嵌套结构体
    type inter struct {
        name string
        age  int
    }
    
        type outer struct {
        id    int
        inter inter
    }
    
    func test01() {
        // 隐式声明
        Bob := person{
            name:  "bob",
            age:   18,
            hight: 190,
        }
        fmt.Println(Bob)
    }
    
    func test02() {
        // 按照字段顺序进行初始化
        Alice := person2{
            "alice", 18, 189,
        }
        fmt.Println(Alice)
    }
    
    func test03() {
        // 匿名结构体
        Jack := struct {
            name  string
            age   int
            hight int
        }{
            name:  "Jack",
            age:   20,
            hight: 178,
        }
        fmt.Println(Jack)
    }
    
    func test04() {
        // 不赋值的时候的默认值
        var nobody = person{}
        fmt.Println(nobody)
    }
    
    func test05() {
        // 声明指定字段
        Candy := person{
            name: "Candy",
        }
        fmt.Println(Candy)
    }
    
    func test06() {
        // 对于结构体中字段的单独访问与赋值
        Douglas := person{
            name:  "Douglas",
            age:   18,
            hight: 24,
        }
        fmt.Println("name:", Douglas.name)
        fmt.Println("age:", Douglas.age)
        fmt.Println("hight", Douglas.hight)
        Douglas.age = 19
        fmt.Println("age:", Douglas.age)
    }
    
    func test07() {
        Douglas := &person{
            name:  "Douglas",
            age:   18,
            hight: 24,
        }
        fmt.Println("name:", (*Douglas).name)
        fmt.Println("age:", (*Douglas).age)
        fmt.Println("hight", (*Douglas).hight)
        fmt.Println("age:", Douglas.age) // 解引用的方式访问
    }
    
    func test08() {
        Kenny := person3{
            "kenny",
            12,
        }
        fmt.Println("Kenny:", Kenny)
        fmt.Println("Kenny string", Kenny.string)
        fmt.Println("Kenny int", Kenny.int)
    }
    
    func test09() {
        Penny := outer{
            id: 12345,
            inter: inter{
                name: "Penny",
                age:  18,
            },
        }
    
        fmt.Println("Penny:", Penny)
        // 字段的提升
    }
    
    func test10() {
    // 比较
    Kenny01 := person3{
        "kenny",
        12,
    }
    
    Kenny02 := person3{
        "kenny",
        12,
    }
    
    fmt.Println(Kenny01 == Kenny02)
        fmt.Println(reflect.DeepEqual(Kenny01, Kenny02))
    }
    
    // 结构体可以有方法
    func (l person) showPersonInfo(n int) {
        fmt.Println("name:", l.name)
        fmt.Println("age", l.age)
        fmt.Println("age+n", l.age+n)
    }
    
    // 我不明白这和上面有啥区别
    // 学习了一下指针,明白了
    func (p *person) addAge(n int) {
        p.age = p.age + n
        fmt.Println("addAge:", p.age)
    }
    
    func test11() {
        Bob := person{
            name:  "bob",
            age:   18,
            hight: 190,
        }
        fmt.Println("showPersonInfo(8)----------------")
        Bob.showPersonInfo(8)
        fmt.Println("addAge(10)-----------------------")
        Bob.addAge(10)
    }
    
    func main() {
        test01()
        fmt.Println("---------------------------------")
        test02()
        fmt.Println("---------------------------------")
        test03()
        fmt.Println("---------------------------------")
        test04()
        fmt.Println("---------------------------------")
        test05()
        fmt.Println("---------------------------------")
        test06()
        fmt.Println("---------------------------------")
        test07()
        fmt.Println("---------------------------------")
        test08()
        fmt.Println("---------------------------------")
        test09()
        fmt.Println("---------------------------------")
        test10()
        fmt.Println("---------------------------------")
        test11()
        fmt.Println("---------------------------------")
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值