go-类型
type用来定义类型的struct定义结构体类型,用于复合结构对象- 注意:Go 类型声明不需要使用冒号
:,这点和ts有点区分
type定义类型理解
- struct结构体类型声明,需要通过type来定义
type 类型名 底层类型
- 通过type来定义新的类型
- 而
int、string这种基础类型,不需要通过type,因为这些go已经内置定义好的类型,而struct是用来创建新的类型语法需要通过type
常用的类型
| 类型 | 示例 | 用途 |
|---|---|---|
string | "hello" | 字符串 |
int | 18 | 整数,最常用 |
int64 | 1690000000 | 大整数、时间戳、数据库 ID |
float64 | 99.5 | 小数 |
bool | true | 布尔值 |
[]T | []string | Slice,动态数组 |
map[K]V | map[string]string | 键值数据 |
struct | type User struct {} | 定义业务对象 |
interface | interface{} | 接口定义、抽象能力 |
*T | *User | 指针 |
结构体类型
struct是 Go 里的结构体类型语法,用来把多个不同类型的字段组合成一个新的类型- 相当于把多个字段组合起来,定义一种新的复合数据结构类型
type User struct {
ID int
Username string
Email string
}
// 结构体类型初始化
user1 := User{}
user2 := User{ID:1,Username:"qqqiu"}
- 相当于ts的
type User = {
ID: number
Username: string
Email: string
}
接口定义
- interface用来定义一个类型必须具备哪些方法”
type Animal interface {
Speak()
}
type Dog struct{}
func (d Dog) Speak() {
fmt.Println("汪汪")
}
指针类型
- 指针类型:这个变量里存的不是普通值,而是“某一种类型数据的地址”
- 指针类型语法:
*类型
// 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 也会把它们当成不同的类型,防止错误赋值或传参
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 语言也支持直接使用内置类型进行类型转换
type Name string
type Age int
func main() {
// 进行类型转换,将字符串常量 "hello" 转换为 Name 类型
name := Name("hello")
age := Age(18)
// 使用内置类型
str := string("test")
}