Golang type 关键字
最后修改于 2025 年 5 月 7 日
本教程将介绍如何在 Go 中使用 `type` 关键字。我们将通过创建自定义类型的实际示例来涵盖类型定义。
`type` 关键字可以基于现有类型创建一个新的命名类型,或定义一个新结构。它是构建类型安全程序的基础。
在 Go 中,`type` 可以创建类型别名、结构体类型、接口类型等等。它通过强类型提高了代码的可读性和可维护性。
基本类型别名
`type` 最简单的用法是为现有类型创建别名。此示例演示了从 `float64` 创建 `Celsius` 类型。
package main
import "fmt"
type Celsius float64
func main() {
var temp Celsius = 23.5
fmt.Printf("Temperature: %v°C\n", temp)
fmt.Printf("Type: %T\n", temp)
}
`Celsius` 是一个独立于 `float64` 的类型,尽管它们共享相同的底层表示。 `%T` 格式化动词会显示类型名称。
结构体类型定义
`type` 通常用于定义结构体类型。此示例创建了一个带有 `name` 和 `age` 字段的 `Person` 结构体。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Printf("%+v\n", p)
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}
`Person` 结构体将相关的数据字段分组。结构体字段通过点表示法访问。 `%+v` 格式化动词会显示字段名称。
接口类型
接口定义了类型可以实现的 메서 집합 (method sets)。此示例显示了一个带有 `Area` 方法的基本 `Shape` 接口。
package main
import (
"fmt"
"math"
)
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
func main() {
var s Shape = Circle{Radius: 5}
fmt.Printf("Area: %.2f\n", s.Area())
}
`Circle` 通过提供 `Area` 方法来实现 `Shape`。接口变量 `s` 可以持有任何满足该接口的类型。
函数类型
`type` 可以定义函数签名。此示例创建了一个用于字符串操作的 `transformer` 函数类型。
package main
import (
"fmt"
"strings"
)
type StringTransformer func(string) string
func transform(s string, fn StringTransformer) string {
return fn(s)
}
func main() {
upper := func(s string) string {
return strings.ToUpper(s)
}
result := transform("hello", upper)
fmt.Println(result)
}
`StringTransformer` 定义了一个接受和返回字符串的函数类型。这使得可以将函数作为参数传递,同时保持类型安全。
类型嵌入
Go 支持类型嵌入以进行组合。此示例将 `Person` 类型嵌入到 `Employee` 类型中。
package main
import "fmt"
type Person struct {
Name string
Age int
}
type Employee struct {
Person
Position string
Salary float64
}
func main() {
emp := Employee{
Person: Person{Name: "Bob", Age: 40},
Position: "Developer",
Salary: 75000,
}
fmt.Printf("%+v\n", emp)
fmt.Printf("Name: %s, Position: %s\n", emp.Name, emp.Position)
}
`Employee` 嵌入了 `Person`,继承了其字段和方法。嵌入的字段可以直接访问,无需限定。
类型开关
类型开关可与自定义类型一起使用。此示例通过 `switch` 语句演示类型检查。
package main
import "fmt"
type ID string
type Number int
func printType(x interface{}) {
switch v := x.(type) {
case ID:
fmt.Printf("ID: %v\n", v)
case Number:
fmt.Printf("Number: %v\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}
func main() {
printType(ID("abc123"))
printType(Number(42))
printType("test")
}
类型开关会检查接口值的动态类型。每个 `case` 匹配一个特定的类型,而 `default` 处理未匹配的类型。
方法接收者
自定义类型可以拥有方法。此示例向 `Distance` 类型添加了方法。
package main
import "fmt"
type Distance float64
func (d Distance) Meters() float64 {
return float64(d)
}
func (d Distance) Kilometers() float64 {
return float64(d) / 1000
}
func main() {
dist := Distance(1500)
fmt.Printf("%.2f meters = %.2f kilometers\n",
dist.Meters(), dist.Kilometers())
}
方法在函数名之前使用接收者参数进行定义。 `Distance` 类型获得了 `Meters` 和 `Kilometers` 方法用于单位转换。
来源
本教程通过创建自定义类型、结构体、接口和方法的实际示例,讲解了 Go 中的 `type` 关键字。