Go语言结构体

结构体

  1. 定义

    结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。

    type struct_variable_type struct {
       member definition
       member definition
       ...
       member definition
    }
    

    定义与初始化

    type Books struct {
       title string
       author string
       subject string
       book_id int
    }
    func main() {
        // 创建一个新的结构体
        fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})
        // 也可以使用 key => value 格式
        fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})
        // 忽略的字段为 0 或 空
        fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})
    }
    
  2. 匿名结构体

    多用于临时场景

    func main(){
        var s struct{
            x string
            y int
        }
        s.x = "hh"
        x.y = 99
        fmt.Printf("%T\n", s)
    }
    
  3. 结构体指针

    // 创建指针类型结构体
    var p2 = new(person)
    
    var struct_pointer *Books  // 声明变量
    struct_pointer = &Book1  // 变量赋值
    struct_pointer.title  // 访问结构体成员
    
  4. 构造函数

    返回一个结构体变量的函数

    type person struct{
        name string
        age int
    }
    // 自己写一个函数用于相应结构体的初始化
    func newPPerson(name string, age *int) *person{
        return &person{
            name := name
            age := age
        }
    }
    
  5. 方法和接收者

    Go语言中,方法(Method)是一种用于特定变量的函数。这种特定的类型变量叫做接收者(Receiver)。接收者的概念类似其他语言的thisself

    语法格式:

    func (接收者变量 接收者类型) 方法名(参数列表) (返回参数){
        函数体
    }
    

    其中:

    • 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者的第一个小写字母,而不是selfthis之类的命名。
    • 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型
    • 方法名:参数列表、返回参数:具体格式与函数定义相同

    方法与函数的区别是:函数不属于任何类型、方法属于特定的类型。

    为了保持一致性,如果有某个方法使用了指针接收者,那么其他方法也应该采用指针接收者

    例:

    package main
    
    // 共有结构体必须写注释
    // Dog 这是一个共有结构体
    type Dog struct{
        name string
    } 
    
    func newPDog(name string) *Dog{
        return &Dog{
            name := name,
        }
    }
    
    // 方法是作用于特定发类型的函数
    // 接收者表示的是调用该方法的具体类型变量,多用类型名首字母表示
    func (d dog) wang(){
        fmt.Printf("%s: 汪汪汪~", d.name)
    }
    
    func main(){
        d1 := newDog("zhoulin")
        d1.wang()
    }
    
  6. 匿名嵌套结构体

    在结构体成员访问时,可以直接访问嵌套结构体中的成员

    type address struct{
        province string
        city string
    }
    
    type person struct{
        name string
        age int
        address  // 匿名嵌套结构体
    }
    
    func main(){
        p1 := person{
            name: "zgh",
            age: 100,
            address: address{
                province: "山东",
                city: "泰安"}
        }
        // 通过匿名结构体可以直接找到相应的成员
        fmt.Println(p1.city)
    }
    
  7. 模拟继承

    type animal struct{
        name string
    }
    
    func (a animal) move(){
        ...
    }
    
    type dog struct{
        feet int
        animal  // animal拥有的方法,此时dog也有了
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值