go1.18泛型实例学习【待调试版】

视频教程 https://www.bilibili.com/video/BV1ky4y1V7tJ

基本含义
  [泛型标识 泛型约束] 举例[T any]
  注意:1.17版本的泛型方法不允许暴露

泛型方法
  func F[T any](t T)(z T){}

泛型结构体
  type User[T any] struct{
      Name T
  }

泛型map
  注意key必须要定义与页数才可使用

泛型切片
  类似于泛型结构体

创建泛型约束
1、
type MyType interface{
  type int int8
}

2、同样可以通过自己实现接口来实现约束

3、type+接口混合使用

泛型结构体的泛型方法
type MyType(T any) struct {}
func (m MyType(t)) name(t T)(z T) {}
 

package main
import (
    "fmt"
    "strconv"
)

func test(i int)string{
    return strconv.Itoa(i)
}

func main() {
    fmt.Println(test(123))
}


--------方法---------

package main
import (
    "fmt"
    "strconv"
)

func test[T any](i T)T{
    return i
}

func main() {
    fmt.Println(test[string]("123")+"456")
    fmt.Println(test[int](123)+456)
}

-------结构体----------

package main
import "fmt"

func test[T any](i T)T{
    return i
}

func main() {
    fmt.Println(test[string]("123")+"456")
    fmt.Println(test[int](123)+456)
}

-------结构体----------

package main
import "fmt"

type my[A any] struct {
    Name A
}

func main() {
    m := my[string]{
        Name: "jenny",
    }
    fmt.Println(m)
}

-------map----------

package main
import "fmt"

type myC[A any] []A

func main() {
    c := myC[string]{"123","456"}
    fmt.Println(c)
}


-------切片----------

package main
import "fmt"

type MyType interfacce {
    type string,int,bool
}

type myC[K MyType,V any] map[K]V

func main() {
    c := make(myC[string,int])
    c["age"]  = 123
    fmt.Println(c)
}


-------接口-1----------

package main
import "fmt"

type MyType interfacce {
    getValue() string
}

func test[T MYType](t T) {
    fmt.Println(t.getValue())
}

type my struct {
    Name string
}

func (m my) getValue() string {
    return m.Name
}

func main() {
    m := my{Name: "奇妙"}
    z := test[my](m)
    fmt.Println(z.Name)
}


-------接口-type+接口的混合使用----------

package main
import "fmt"

type MyType interfacce {
    type int,string //方法约束为int或string类型
    getValue() string
}

func test[T MYType](t T) {
    fmt.Println(t.getValue())
}

type myStrting string

func (m myStrting) getValue() string {
    return "456"
}

func main() {
    var a string
    a = "123"
    test[myString](a)
    m := my{Name: "奇妙"}
    
}


泛型结构体的泛型方法

type MyType(T any) struct {}
func (m MyType(t)) name(t T)(z T) {}

package main
import "fmt"

type my[T any] struct {
    Name string
}

func (m my[T]) getValue(t T) T {
    return t
}

func main() {
    m := my[int]{Name: "qimiao"}
    fmt.Println(m.getValue(123)+456) //579
}

### Golang 中的概述 Go 语言自1.18 开始支持编程特性,这使得开发者能够编写更加通用和可重用的代码。然而,在某些场景下,使用并不会显著提升代码质量反而可能增加复杂度[^1]。 ### 的基本概念 允许定义带有类参数的函数或数据结构,这些类参数可以在实例化时由具体的类替代。通过这种方式,可以创建适用于多种类的算法而不必为每种类单独实现逻辑[^4]。 ### 创建结构体 下面是一个简单的例子展示了如何声明并初始化一个具有三个不同基础类约束(`string`, `int`, 或 `float64`)的结构体: ```go type Struct1[T string | int | float64] struct { Title string Content T } func main() { s := Struct1[string]{Title: "Example", Content: "Hello"} } ``` 此段代码定义了一个名为 `Struct1` 的结构体,并指定了其成员字段之一 (`Content`) 可以为字符串、整数或浮点数值。在主程序中,则创建了该结构体的一个实例并将具体内容设置为了字符串类的数据[^3]。 ### 编写函数 当涉及到操作多个相同类的元素集合时,比如求两个数字之和的操作也可以利用来增强灵活性: ```go // Sum 计算任意两种兼容加法运算符的数值相加之总和. func Sum[T int | int32 | float32](a, b T) T { return a + b } func main(){ result := Sum[int](5,7) fmt.Println(result)// 输出:12 } ``` 上述示例中的 `Sum` 函数接受两个同类的输入参数并通过指定类列表 `[T int | int32 | float32]` 来限定允许传入的具体类范围;这样做的好处在于既保持了良好的性能又提高了代码复用率。 ### 应用建议 尽管提供了强大的功能,但在实际开发过程中应当权衡利弊合理运用。对于那些已经存在良好解决方案的地方不必强行引入额外层次的抽象以免造成不必要的麻烦。只有当我们确实遇到重复模式并且确认可以通过简化设计的时候才应考虑采用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值