首页 > 编程笔记 > Go语言笔记 阅读:12

Go语言构造函数的实现方式(非常详细,附带实例)

Go 语言中没有构造函数的概念,但是通过结构体初始化的过程可以模拟构造函数,也就是以构造函数的方式实例化结构体,并在实例化过程中为结构体中的成员赋值。函数的返回值是结构体的实例,并以指针形式表示。

Go语言不带参数的构造函数

如果构造函数未设置参数,那么结构体的成员值可以在函数内定义。代码如下:
package main

import (
    "fmt"
)

type profile struct {
    name string
    age  int
}

func NewProfile() *profile {
    //定义变量,作为结构体的成员值
    name := "张三"
    age := 20
    //初始化结构体
    p := profile{
        name: name,
        age:  age,
    }
    return &p
}

func main() {
    //调用函数
    p := NewProfile()
    fmt.Printf("姓名:%v\n", p.name)
    fmt.Printf("年龄:%v\n", p.age)
}
运行结果如下:

姓名:张三
年龄:20

上述代码定义表示个人简介的结构体 profile,通过模拟构造函数初始化结构体,在函数中将变量的值作为结构体的成员值。

Go语言带参数的构造函数

为了灵活地使用构造函数,可以将函数的参数作为结构体成员值进行传递。

例如,将上述示例代码中的构造函数修改为使用参数的形式,代码如下:
package main

import (
    "fmt"
)

type profile struct {
    name string
    age  int
}

func NewProfile(name string, age int) *profile {
    //初始化结构体
    p := profile{
        name: name,
        age:  age,
    }
    return &p
}

func main() {
    //调用函数
    p := NewProfile("张三", 20)
    fmt.Printf("姓名:%v\n", p.name)
    fmt.Printf("年龄:%v\n", p.age)
}
运行结果如下:

姓名:张三
年龄:20

Go语言为嵌套的结构体使用构造函数

如果想通过模拟构造函数初始化嵌套结构体,则可以分别为多个结构体创建构造函数。代码如下:
package main

import (
    "fmt"
)

type job struct {
    position string
    year     int
}

type info struct {
    name    string
    age     int
    record  job
}

func NewJob(position string, year int) *job {
    //初始化 job 结构体
    return &job{
        position: position,
        year:     year,
    }
}

func NewInfo(name string, age int, position string, year int) *info {
    //调用函数初始化 job 结构体
    record := *NewJob(position, year)
    //初始化 info 结构体
    return &info{
        name:    name,
        age:     age,
        record:  record,
    }
}

func main() {
    //调用函数
    p := NewInfo("张三", 32, "艺术总监", 6)
    fmt.Printf("姓名:%v\n", p.name)
    fmt.Printf("年龄:%v\n", p.age)
    fmt.Printf("职位:%v\n", p.record.position)
    fmt.Printf("工作年限:%v 年\n", p.record.year)
}
运行结果如下:

姓名:张三
年龄:32
职位:艺术总监
工作年限:6年

上述代码分别为 job 结构体和 info 结构体创建构造函数,通过这两个构造函数可以快速实例化两个结构体。

相关文章