Menu
CoddyTech

匿名结构体

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

匿名结构体是没有命名类型的结构体。你可以一步定义它的结构并创建实例,无需使用 type 关键字。

person := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  30,
}

这样可以直接创建结构体值,而无需声明可重复使用的类型。当你需要一个只使用一次、不会在代码其他地方使用的临时数据结构时,匿名结构体很有用。

一个常见的使用场景是为单个函数或测试用例分组存放相关数据。

config := struct {
    Host string
    Port int
}{
    Host: "localhost",
    Port: 8080,
}
fmt.Println(config.Host) // localhost

匿名结构体在表驱动测试中也很常用,因为每个测试用例都有独特的字段。

tests := []struct {
    input    int
    expected int
}{
    {1, 2},
    {5, 10},
}

由于匿名结构体没有类型名,因此你无法为它们定义方法,也无法在其他地方重复使用这种类型。匿名结构体适合用于临时、局部的数据分组。对于需要多次引用的内容,请改为定义一个命名结构体类型。

challenge icon

挑战

简单

让我们构建一个简单的配置系统,展示匿名结构体的优势:它适合将数据临时分组,而这些数据不需要可复用的类型。

你需要将代码分放在两个文件中:

  • config.go:创建一个名为 GetServerConfig 的函数,它接受服务器名称(字符串)、端口(整数)和调试模式(布尔值)作为参数。该函数应返回一个匿名结构体,并将这三个值作为字段:Name、Port 和 Debug。由于这份配置只在一个地方使用,因此无需为它定义具名类型。
  • main.go:从输入中读取服务器配置值,调用 GetServerConfig 函数,并显示配置详情。

输入如下:

  • 第 1 行:服务器名称
  • 第 2 行:端口号
  • 第 3 行:调试模式(true 或 false)

输出格式:

Server: [Name]
Port: [Port]
Debug: [Debug]

例如,输入 api-server、8080 和 true 时,输出应为:

Server: api-server
Port: 8080
Debug: true

注意,匿名结构体让你无需在代码库中添加只使用一次的类型,就能返回分组后的数据。

亲手试试

package main

import (
	"fmt"
)

func main() {
	// 读取输入值
	var name string
	var port int
	var debug bool

	fmt.Scanln(&name)
	fmt.Scanln(&port)
	fmt.Scanln(&debug)

	// TODO: 用输入值调用 GetServerConfig
	// 并保存返回的匿名结构体

	// TODO: 按要求的格式打印配置:
	// Server: [Name]
	// Port: [Port]
	// Debug: [Debug]
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Go 在线编译器