Golang 学习笔记09:泛型

AI-摘要
Yuan GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
Golang 学习笔记09:泛型
SEAlencehe泛型函数
定义一个加法函数,如果调用传参类型不符会报错
func plus(n1, n2 int) int {
return n1 + n2
}
func main() {
res := plus(1, 2)
println(res)
var u1 ,u2 =uint(2), uint(3)
plus(u1,u2)
}
使用泛型,这里的T是占位符
func plus[T int | uint](n1, n2 T) T {
return n1 + n2
}
多个泛型
func myPrint[T int, K string | int](n1 T, n2 K) {
}
如果比较多的情况使用interface
type Number interface {
int | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | uint
}
func myPrint[T int, K string | Number](n1 T, n2 K) {
}
泛型结构体
假设一个响应的结构体序列化
type Response struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data any `json:"data"`
}
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
res := Response{
Code: 1001,
Msg: "成功",
Data: User{
Name: "张三",
Age: 18,
},
}
byteData, _ := json.Marshal(res)
fmt.Println(string(byteData))
{"code":1001,"msg":"成功","data":{"name":"张三","age":18}}
假设两个json序列化
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
type UserInfo struct {
Name string `json:"name"`
Gender string `json:"gender"`
}
user := Response{
Code: 1001,
Msg: "成功",
Data: User{
Name: "张三",
Age: 18,
},
}
//json序列化
byteData, _ := json.Marshal(user)
fmt.Println(string(byteData))
userInfo := Response{
Code: 1001,
Msg: "成功",
Data: UserInfo{
Name: "张三",
Gender: "男",
},
}
//json序列化
byteData, _ = json.Marshal(userInfo)
fmt.Println(string(byteData))
{"code":1001,"msg":"成功","data":{"name":"张三","age":18}}
{"code":1001,"msg":"成功","data":{"name":"张三","gender":"男"}}
反序列化
var user Response
json.Unmarshal([]byte(`{"code":1001,"msg":"成功","data":{"name":"张三","age":18}}`), &user)
fmt.Println(user)
{1001 成功 map[age:18 name:张三]}
注意:json.Unmarshal的第二个参数要带指针
可以看到,此时data是map,并不能使用.语法
解决办法,Response的Data就不能写成any类型了
type Response[T any] struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data T `json:"data"`
}
指定反序列化的类型
var user Response[User]
json.Unmarshal([]byte(`{"code":1001,"msg":"成功","data":{"name":"张三","age":18}}`), &user)
fmt.Println(user) //{1001 成功 {张三 18}}
此时就能使用.语法了
var user Response[User]
json.Unmarshal([]byte(`{"code":1001,"msg":"成功","data":{"name":"张三","age":18}}`), &user)
fmt.Println(user) //{1001 成功 {张三 18}}
var userInfo Response[UserInfo]
json.Unmarshal([]byte(`{"code":1001,"msg":"成功","data":{"name":"张三","gender":"男"}}`), &userInfo)
fmt.Println(userInfo) //{1001 成功 {张三 男}}
泛型切片
type MySlice[T int | string] []T
var mySlice = MySlice[int]{1, 2, 3}
泛型map
type MyMap[K string, V int | string] map[K]V
var myMap = MyMap[string, int]{"a": 1, "b": 2}
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果





