首页 > 编程笔记 > Go语言笔记

Go语言构造函数的用法

在 Go 语言中,我们可以在结构体内添加一个函数,实现以函数方式实例化结构体,在实例化过程中按照规则对各个结构体成员进行赋值操作,这样的函数就叫做构造函数。

构造函数能减少函数或主函数的代码冗余。构造函数的参数可以选择性作为结构体的成员值,如果没有参数,结构体的成员值在函数内生成或使用默认值;函数返回值是结构体的实例化变量,并且以指针形式表示。

比如定义结构体 cat,程序在 1~10 随机生成一个数,如果随机数大于 5,结构体 cat 代表老虎;否则为狮子,示例如下:
package main

import (
    "fmt"
    "math/rand"
    "time"
)

type cat struct {
    // 定义结构体
    name   string
    weight int
    // 结构体成员为匿名结构体
    habit struct {
         ambient string
         style string
    }
}

func get_cat() *cat {
    // 定义构造函数
    // 设置随机数的种子
    rand.Seed(time.Now().UnixNano())
    n := rand.Intn(10)
    // 定义变量,用于设置结构体的成员值
    var name, ambient, style string
    var weight int
    // 根据随机数设置变量值
    if n <= 5 {
         name = "tiger"
         weight = 500
         ambient = "山林"
         style = "独居"
    } else {
         name = "lion"
         weight = 300
         ambient = "草原"
         style = "群居"
    }
    // 实例化结构体
    c := cat{
         name:   name,
         weight: weight,
         // 匿名结构体实例化
         habit: struct {
              ambient string
              style string
         }{ambient: ambient, style: style},
    }
    return &c
}

func main() {
    // 调用构造函数,获取结构体实例化变量
    c := get_cat()
    fmt.Printf("猫科动物为:%v\n", c.name)
    fmt.Printf("体重为:%v\n", c.weight)
    fmt.Printf("居住环境:%v\n", c.habit.ambient)
    fmt.Printf("生活方式:%v\n", c.habit.style)
}
上述代码一共分为 3 部分:定义结构体、定义构造函数、主函数 main(),每部分实现的功能如下:
1)结构体 cat 设置了成员 name、weight 和 habit,对应的数据类型分别为字符串、整型和结构体,结构体成员 habit 使用匿名结构体定义,匿名结构体的成员为 ambient 和 style,其数据类型皆为字符串。

2)构造函数 get_cat() 没有设置参数,只设置了返回值,并且返回值的数据类型为结构体 cat 的指针类型。在构造函数中,通过内置包 rand 随机生成 1~10 的整数,根据随机数的数值分别设置变量 name、weight、ambient、style 的值,这些变量将作为结构体 cat 的成员值。由于结构体 cat 的成员 habit 为匿名结构体,因此在实例化的时候,必须再次定义匿名结构体并执行赋值操作。

3)主函数 main() 调用构造函数 get_cat(),并将函数返回值赋值给变量 c,通过变量 c 访问结构体的成员并输出相应数值。

在 GoLand 中运行上述代码,运行结果为:

猫科动物为:tiger
体重为:500
居住环境:山林
生活方式:独居

相关文章