匿名结构体
本课属于 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},
}由于匿名结构体没有类型名,因此你无法为它们定义方法,也无法在其他地方重复使用这种类型。匿名结构体适合用于临时、局部的数据分组。对于需要多次引用的内容,请改为定义一个命名结构体类型。
挑战
简单让我们构建一个简单的配置系统,展示匿名结构体的优势:它适合将数据临时分组,而这些数据不需要可复用的类型。
你需要将代码分放在两个文件中:
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]
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Go 在线编译器