Golang基础--07--结构struct

目录

定义与使用

  • Go中struct与C中的struct非常相似,并且Go没有class,没有构造函数
  • 使用 type <name> strct{}结构定义,名称遵循可见性规则(大写开头表示public,非大写开头为private)
  • 指向指向自身的指针类型成员,(类似this??)

  • 可以使用字面值对结构进行初始化

  • 允许直接通过指针来读写结构成员(用’.’)
type person struct{
    Name string
    Age int
}
func main(){
//go语言习惯上定义的时候用取地址符,这样作为指针使用会很方便,而且是不是指针都可以直接用'.'来取值
    a := &person{}
    a.Name = "joe"
    a.Age = 19
    /*字面值对结构进行初始化
    a := &person{
        Name: "joe",
        Age: 19,
    }
    */
    a.Name = "ok"
    fmt.Println(a)
    A(a)
    fmt.Println(a)
    B(a)
    fmt.Println(a)
}
func A(per person){
    //值拷贝
    per.Age = 13
    fmt.Println("A",per)
}
func B(per *person){
    //引用拷贝
    per.Age = 13
    fmt.Println("A",per)
}
/*
> Output:
{joe 19}
A {joe 13}
{joe 19}
A &{joe 13}
{joe 13}
*/

匿名结构

  • 支持匿名结构,可用作成员或者定义成员变量
  • 匿名结构也可以用于map的值
func main(){
//匿名结构
    a := &struct {
        Name string
        Age int
    }{
        Name : "joe",
        Age : 19,
    }
    fmt.Println(a)
}
type person struct {
    Name string
    Age int
    Contact struct{
        Phone, City string
    }
}
func main(){
    a := person{Name:"joe", Age: 19}
    a.Contact.Phone = "1234565875"
    a.Contact.City = "beijing"
    fmt.Println(a)
}

匿名字段

  • 支持匿名字段,本质上是定义了以某个类型名为名称的字段
  • 嵌入结构作为匿名字段看起来像继承,但是不是继承
  • 可以使用匿名字段指针
type person struct {
    string
    int
}
func main(){
//字段顺序一定要一致
    a := person{"joe", 19}
    b := a
    fmt.Println(a)
    fmt.Println(b)
}

结构之间的赋值与比较

  • 相同类型成员可以进行直接拷贝赋值
  • 支持==和!=比较运算符,只能在相同类型之间比较,但不支持>或<
type person struct {
    Name string
    Age int
}
type person1 struct {
    Name string
    Age int
}
func main(){
    a := person{Name:"joe", Age:19}
    b := person1{Name:"joe", Age:19}
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println( b == a)
}
/*
> Output:
command-line-arguments
# command-line-arguments
.\hello2.go:18:15: invalid operation: b == a (**mismatched types person1 and person)**
*/

嵌入结构

  • Go语言里面没有class和继承
  • 嵌入的结构名称就当做类型名称
type human struct{
    Sex int
}
type teacher struct {
    human
    Name string
    Age int
}
type student struct{
    human
    Name string
    Age int
}

func main(){
    a := teacher{Name:"joe", Age:19,human: human{Sex:0}}
    b := student{Name:"joe", Age:19,human: human{Sex:1}}
    a.Name ="joe2"
    a.Age = 13
    a.Sex =100
    fmt.Println(a, b)
}
/*
> Output:
command-line-arguments
{{100} joe2 13} {{1} joe 19}
*/

当使用匿名字段或者嵌入字段的时候,如果内层和外层结构具有相同的字段名称,该怎么办呢?

type A struct {
    B
    C
    Name string
}
type B struct {
    Name string
}
type C struct {
    Name string
}

func main(){
    a := A{Name:"A",B: B{Name:"B"},C: C{Name:"C"}}
    fmt.Println(a.Name, a.B.Name,a.C.Name)
}
/*
> Output:
command-line-arguments
A B C
*/

在当前层次结构中找不到的话,就更深层次的结构找
这里写图片描述
图片中,C如果放在结构A里面,那么a.Name就会产生歧义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Go语言中,struct是一种数据类型,用于定义自定义的复合数据结构struct可以包含多个字段,每个字段都有自己的类型和名称。可以使用struct关键字来定义一个struct类型,并在大括号内定义字段。\[1\]在struct中,还可以使用内嵌结构体的方式来组织数据。内嵌结构体是指在一个结构体中嵌入另一个结构体作为其字段。这样可以实现结构体的组合和复用。\[2\]在使用struct时,可以使用简洁的语法格式来创建和初始化结构体变量。可以使用结构体类型名加大括号的方式来创建一个结构体变量,并为每个字段赋值。也可以使用键值对的方式来指定字段的值。\[3\] #### 引用[.reference_title] - *1* *3* [Golang 结构体](https://blog.csdn.net/weixin_47243236/article/details/122028539)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Golang 入门 : 结构体(struct)](https://blog.csdn.net/weixin_30753873/article/details/97302216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值