跳到主要内容

go-类型

  • type 用来定义类型的
  • struct定义结构体类型,用于复合结构对象
  • 注意:Go 类型声明不需要使用冒号 : ,这点和ts有点区分

type定义类型理解​

  • struct结构体类型声明,需要通过type来定义
    • type 类型名 底层类型
  • 通过type来定义新的类型
  • 而int、string 这种基础类型,不需要通过type,因为这些go已经内置定义好的类型,而struct 是用来创建新的类型语法需要通过type

常用的类型​

类型示例用途
string"hello"字符串
int18整数,最常用
int641690000000大整数、时间戳、数据库 ID
float6499.5小数
booltrue布尔值
[]T[]stringSlice,动态数组
map[K]Vmap[string]string键值数据
structtype User struct {}定义业务对象
interfaceinterface{}接口定义、抽象能力
*T*User指针

结构体类型​

  • struct 是 Go 里的结构体类型语法,用来把多个不同类型的字段组合成一个新的类型
  • 相当于把多个字段组合起来,定义一种新的复合数据结构类型
go
type User struct {
ID int
Username string
Email string
}

// 结构体类型初始化
user1 := User{}
user2 := User{ID:1,Username:"qqqiu"}
  • 相当于ts的
typescript
type User = {
ID: number
Username: string
Email: string
}

接口定义​

  • interface用来定义一个类型必须具备哪些方法”
go
type Animal interface {
Speak()
}

type Dog struct{}

func (d Dog) Speak() {
fmt.Println("汪汪")
}

指针类型​

  • 指针类型:这个变量里存的不是普通值,而是“某一种类型数据的地址”
  • 指针类型语法:*类型
go
// p只能保存“指向 int 数据的地址”。
a := 20

var p *int
p = &a // 只能保持变量的指针

p = 20 // 这样是错误的,不能保存int值,只能是指针

自定义类型​

  • 自定义类型可以绑定方法
    • 比如Go 不允许直接给内置的 string 类型定义方法,但可以给自定义的类型添加方法
  • 对类型安全更友好,增强类型安全
    • 即使两个类型的底层类型相同,Go 也会把它们当成不同的类型,防止错误赋值或传参
go
package main

type Name string

// 自定义类型
type Name string

// 给类型定义方法
func (n Name) String() string {
return "qqqiu"
}

func main() {
// 类型转换
name := Name("hello")
println(name.GetName())
}

类型安全​

  • 虽然 UserID 和 OrderID 底层都是 int,但 Go 认为它们是不同类型。
  • 自定义类型能防止意外混用,但不能阻止开发者主动转换
  • 即使两个类型的底层类型相同,Go 也会把它们当成不同的类型,防止错误赋值或传参
go
package main

type UserID int
type OrderID int

func GetUser(id UserID) {
println("用户ID:", id)
}

func main() {
userID := UserID(1001)
orderID := OrderID(2001)

GetUser(userID) // 正确
GetUser(orderID) // 编译错误
}

类型转换​

  • 语法:目标类型(表达式)
  • Go支持自定义类型来进行类型转换
  • Go 语言也支持直接使用内置类型进行类型转换
go
type Name string
type Age int
func main() {
// 进行类型转换,将字符串常量 "hello" 转换为 Name 类型
name := Name("hello")
age := Age(18)

// 使用内置类型
str := string("test")
}