Menu
CoddyTech

结构体初始化

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

Go 提供了几种初始化结构体的方式,每种方式都适用于不同的情况。

命名字段初始化

type Person struct {
    Name string
    Age  int
    City string
}

p1 := Person{
    Name: "Alice",
    Age:  25,
    City: "New York",
}

按位置初始化(顺序必须与字段声明一致)

p2 := Person{"Bob", 30, "London"}

零值初始化(所有字段都获得默认值)

p3 := Person{}
// Name: "", Age: 0, City: ""

部分初始化(未设置的字段会获得零值)

p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""

使用 & 指向结构体

p5 := &Person{
    Name: "Diana",
    Age:  28,
    City: "Paris",
}
fmt.Println(p5.Name) // Diana

使用 var,然后为字段赋值

var p6 Person
p6.Name = "Eve"
p6.Age = 22

命名字段初始化是最常见、最易读的方式。需要指向结构体的指针时,使用 &。

challenge icon

挑战

中等

使用不同的初始化方法创建三个 Player 对象:

  • player1:使用输入值初始化命名字段
  • player2:使用命名字段初始化,Name: "Guest", Class: "Novice", HitPoints: 50
  • player3:使用 var 声明,然后逐个赋值给每个字段

亲手试试

package main

import "fmt"

func main() {
    var name, class string
    var hp int
    fmt.Scan(&name, &class, &hp)

    // TODO: 使用输入值,通过指定字段名初始化来创建 player1

    // TODO: 通过指定字段名初始化来创建 player2:
    // Name: "Guest", Class: "Novice", HitPoints: 50

    // TODO: 使用 var 声明 player3,然后为字段赋值:
    // Name: "Hero", Class: "Knight", HitPoints: 200

    fmt.Printf("Player 1: %s (%s) - HP: %d\n", player1.Name, player1.Class, player1.HitPoints)
    fmt.Printf("Player 2: %s (%s) - HP: %d\n", player2.Name, player2.Class, player2.HitPoints)
    fmt.Printf("Player 3: %s (%s) - HP: %d\n", player3.Name, player3.Class, player3.HitPoints)
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Go 在线编译器