【Golang】结构体、方法

张老太养了两只猫:一只名字叫小白,今年3岁,白色;另一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字、年龄、颜色;如果用户输入的小猫名错误,则显示张老太没有这只猫。1、结构体 将一类事务的特性提取出来(比如猫类),形成一个新的数据类型,就是一个结构体; 通过这个结构体,我们可以创建多个变量(实例/对象); 事务可以是猫类,也可以是person或其他。 package main​import "fmt"​//定义一个Cat结构
摘要由CSDN通过智能技术生成

*本文笔记参考:b站【尚硅谷】Golang入门到实战教程

张老太养了两只猫:一只名字叫小白,今年3岁,白色;另一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字、年龄、颜色;如果用户输入的小猫名错误,则显示张老太没有这只猫。

1、结构体

  • 将一类事务的特性提取出来(比如猫类),形成一个新的数据类型,就是一个结构体;

  • 通过这个结构体,我们可以创建多个变量(实例/对象);

  • 事务可以是猫类,也可以是person或其他。

package main
​
import "fmt"
​
//定义一个Cat结构体
type Cat struct {
    Name  string
    Age   int
    Color string
}
​
func main() {
    //创建一个Cat的变量
    cat1 := Cat{"小白", 3, "白色"}
    cat2 := Cat{"小花", 100, "花色"}
    fmt.Println(cat1, cat2)
}
//输出
//{小白 3 白色} {小花 100 花色}

1)结构体的声明

type 结构体名称 struct {
    field1  type
    field2   type
}

2)字段/属性

注意事项和细节说明:

  1. 从概念或叫法上看,结构体字段=属性=field;

  2. 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型;

  3. 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值):

    • bool类型是false,数值是0,字符串是"";

    • 数组类型的默认值和它的元素类型有关,如score [3]int则为[0,0,0];

    • 指针、slice和map的零值都是nil,即还没有分配空间(map和slice使用之前一定要先make);

    package main
    ​
    import "fmt"
    ​
    //定义一个Cat结构体
    type Cat struct {
        Name   string
        Age    int
        Scores [5]float64
        Color  []string          //切片
        Ptr    *int              // 指针
        Map1   map[string]string //map
    }
    ​
    func main() {
        var cat Cat
        fmt.Println(cat)
    }
    //输出
    //{ 0 [0 0 0 0 0] [] <nil> map[]}
  4. 不同结构体的字段是独立、互不影响的,如果结构体字段的类型是值类型,则该结构体中字段值的改变不会影响到其他结构体;如果结构体字段的类型是引用类型,则该结构体中字段值的改变会导致其他结构体字段值发生改变

    package main
    ​
    import "fmt"
    ​
    //定义一个Cat结构体
    type Cat struct {
        Name  string
        Age   int
        Color []string //切片
    }
    ​
    func main() {
        var cat1 Cat
        cat1.Name = "小白"
        cat1.Age = 3
        cat1.Color = make([]string, 1)
        cat1.Color[0] = "白色"
        fmt.Println("cat1:", cat1)
        cat2 := cat1
        //Name为值类型,cat2.Name的改变不会影响到cat1.Name
        cat2.Name = "小花"
        //Color为引用类型,会导致cat1.Color的值也发生改变
        cat2.Color[0] = "花色"  
        fmt.Printf("cat1: %v\ncat2: %v", cat1, cat2)
    }
    //输出:
    //cat1: {小白 3 [白色]}
    //cat1: {小白 3 [花色]}
    //cat2: {小花 3 [花色]}

3)创建结构体变量和访问结构体字段

方式1:直接声明

var cat1 Cat

方式2:{}

var cat1 = Cat{}      //用var声明
cat1 := Cat{}         //自动推导
cat1 := Cat{"tom", 3} //直接在{}中赋值

方式3:new

var cat1 *Cat = new(Cat) //cat1为一个指针
cat1.Name = "tom"        //等价于(*cat1).Name = "tom"
cat1.Age = 3             //等价于(*cat1).Age = 3

方式4:&

var cat1 *Cat = &Cat{}   //cat1为一个指针
cat1.Name = "tom"        //等价于(*cat1).Name = "tom"
cat1.Age = 3             //等价于(*cat1).Age = 3

说明:

  1. 方式3和方式4返回的是结构体指针

  2. 结构体指针访问字段的标准方式是应该(*结构体指针).字段名,比如(*cat1).Name,但go做了一个简化,也支持结构体指针.字段名,比如cat1.Name,g

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Go语言中,结构体的初始化可以通过以下几种方法来完成。首先,可以使用键值对的方式来初始化结构体的成员变量。例如,定义一个名为cat的结构体,包含name、age和sex三个成员变量,可以通过以下方式进行初始化: cat1 := cat{ name: "小白", age: 12, sex: "male", } 另一种初始化结构体方法是使用多个值的列表来初始化结构体的成员变量。例如,可以按照结构体定义的顺序依次传入相应的值进行初始化: cat1 := cat{"小白", 12, "male"} 还可以使用指针类型的结构体进行初始化。例如,定义一个指向cat结构体的指针类型变量,可以通过以下方式进行初始化: cat1 := &cat{ name: "小白", age: 12, sex: "male", } 最后,还可以使用匿名结构体进行初始化。匿名结构体没有定义结构体类型名,直接使用花括号{}进行初始化。例如: cat1 := struct { name string age int sex string }{ name: "小白", age: 12, sex: "male", } 这些是几种常见的初始化结构体方法,根据实际情况选择适合的方式进行初始化即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Go语言结构体如何进行初始化](https://blog.csdn.net/weixin_52723461/article/details/124819621)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Golang结构体和map](https://download.csdn.net/download/weixin_38731199/14037169)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值