Menu
CoddyTech

构造函数

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 10 课,共 107 课。

Go 没有像其他语言那样的构造函数。相反,惯例是创建一个名为 NewTypeName 的函数,返回一个已初始化的结构体,通常返回指针。

基本构造函数

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

带默认值的构造函数

type Config struct {
    Host    string
    Port    int
    Timeout int
}

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // 默认值
        Timeout: 30,      // 默认值
    }
}

带验证的构造函数

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

使用构造函数

func main() {
    p1 := NewPerson("Alice", 25)
    fmt.Println(p1.Name) // Alice

    p2 := NewPerson("", -5)
    fmt.Println(p2.Name) // Unknown
    fmt.Println(p2.Age)  // 0
}

构造函数使用 & 返回指针(*StructName)。这样可以避免复制结构体,并让指针接收者的方法直接使用它。验证和默认值应放在构造函数中。

challenge icon

挑战

中等

为 BankAccount 结构体创建一个带验证的构造函数 NewBankAccount:

  • 接收 name(字符串)和 balance(float64)作为参数
  • 如果 name 为空,则默认设为 "Unnamed"
  • 如果 balance 为负数,则默认设为 0
  • 始终将 Owner 设为 "Default Owner"
  • 返回指向新结构体的指针

亲手试试

package main

import "fmt"

func main() {
    var name string
    var balance float64
    fmt.Scan(&name, &balance)

    account := NewBankAccount(name, balance)

    fmt.Printf("Account: %s\n", account.Name)
    fmt.Printf("Balance: %.2f\n", account.Balance)
    fmt.Printf("Owner: %s\n", account.Owner)
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Go 在线编译器