Golang 之 Struct结构体

  • 声明结构体
    package main
    import "fmt"
    
    type Person struct {
    	Name string
    	Age  int
    }
    
    func main() {
    	p1 := Person{"abc", 30}
    	fmt.Println(p1)
    
    	p2 := Person{Name: "xyz", Age: 40}
    	fmt.Println(p2)
    
    	p3 := Person{}
    	p3.Name = "golang"
    	p3.Age = 8
    	fmt.Println(p3)
    }
    // 注意:结构体中成员属性的顺序很重要,即使两个结构体成员属性相同,但是顺序不同,那么这个两个结构体不相同。
    
    
    // 匿名结构体
    func main() {
    	test := struct {
    		Name string
    		Age  int
    	}{
    		"abc",
    		99,
    	}
    	fmt.Println(test) //{abc 99}
    }
  • 使用结构体
    有三种方式可以使用结构体:
    
    var staff Staff
    staff1 := new(Staff)
    staff2 := &Staff{}
    
    上面2和3的效果是一样的,返回的都是指向结构体的指针。
  • 嵌套结构体

    // 语义上embedding是一种“继承关系“,而不是”成员关系“ 
    // 一个定义内有多个embedding,则很难判断某个成员变量或函数是从哪里继承得到的
    // 一个定义内有多个embedding,危害和在python中使用”from xxx import *"是类似的
    
    
    // 匿名嵌套
    package main
    
    import "fmt"
    
    type Person struct {
    	Name string
    	Age  int
    }
    type Student struct {
    	Person           // is a的关系,Student is a Person
    	Major string     // has a的关系,Student has a Major
    }
    
    func main() {
    	s1 := Student{Person{"demo", 99}, "php"}
    	fmt.Println(s1)
    
    	s2 := Student{}
    	s2.Person.Name = "test"
    	s2.Person.Age = 88
    	s2.Major = "Java"
    	fmt.Println(s2)
    
    	s3 := Student{}
    	s3.Name = "hello"
    	s3.Age = 77
    	s3.Major = "C#"
    	fmt.Println(s3)
    
    	p1 := Person{"world", 66}
    	s4 := Student{p1, "JS"}
    	fmt.Println(s4)
    }
    
    
    // 非匿名嵌套
    package main
    
    import "fmt"
    
    type Person struct {
    	Name string
    	Age  int
    }
    type Student struct {
    	per   Person
    	Major string
    }
    
    func main() {
    	s1 := Student{Person{"demo", 99}, "php"}
    	fmt.Println(s1)
    
    	s2 := Student{}
    	s2.per.Name = "test"
    	s2.per.Age = 88
    	s2.Major = "Java"
    	fmt.Println(s2)
    	/*
    		//错误
    		s3 := Student{}
    		s3.Name = "hello"
    		s3.Age = 77
    		s3.Major = "C#"
    		fmt.Println(s3)
    	*/
    	p1 := Person{"world", 66}
    	s4 := Student{p1, "JS"}
    	fmt.Println(s4)
    
    }
    
  • 匿名组合-重名问题

    package main
    
    import "fmt"
    
    type demo1 struct {
    	Name string
    }
    
    type demo2 struct {
    	Name string
    }
    
    type Demo struct {
    	demo1
    	demo2
    }
    
    func main() {
    	/*
    	注释掉的内容是错误方法
    	dd := Demo{"abc", "xyz"}//两个成员都是结构体,当然不能用字符串赋值了,应该使用结构体
    	dd := Demo{{"abc"}, {"xyz"}}
    	dd := Demo{demo1: {"abc"}, demo2: {"xyz"}}
    	*/
    	dd := Demo{demo1{"abc"}, demo2{"xyz"}}
    	fmt.Println(dd)
    
    	dd2 := Demo{}
    	dd2.demo1.Name = "abc"
    	dd2.demo2.Name = "xyz"
    	fmt.Println(dd2)
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值