【Golang】结构体、方法

本文介绍了Golang中的结构体和方法,包括结构体的声明、字段、创建与访问,以及方法的声明、调用和传参机制。通过学生、盒子和景区门票案例展示了面向对象编程的应用,并探讨了结构体与方法的区别。同时,提到了工厂模式在Golang中的实现。
摘要由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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值