Generics

2024-02-12 22:18
文章标签 generics

本文主要是介绍Generics,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

泛型,也被称为类型参数,允许定义结构体或方法时,传入的参数类型不固定,运行时,可传入不同类型的参数。

定义方法

func MapKeys[K comparable, V any](m map[K]V) []K {r := make([]K, 0, len(m))for k := range m {r = append(r, k)}return r
}

该方法从任何类型的映射中取出键名。
该方法有两个类型参数:K和V,分别对应作为参数的映射的键名和键值的类型。
该方法返回一个切片,切片的类型和映射参数的键名的类型相同。

var m1 = map[int]string{1: "2", 2: "4", 4: "8"}
fmt.Println("keys m:", MapKeys(m1))
var m2 = map[string]string{"a": "2", "b": "4", "c": "8"}
fmt.Println("keys m:", MapKeys(m2))

map[1001:Aaron 1002:Ab 1003:Abbas 1004:Abbot] with keys: [1001 1002 1003 1004]
map[Aaron:doctor Ab:nurse Abbas:teacher Abbot:police] with keys: [Aaron Ab Abbas Abbot]

我们也可以明确的指定类型参数,虽然没必要。

var m = map[int]string{1001: "Aaron", 1002: "Ab", 1003: "Abbas", 1004: "Abbot"}
fmt.Println(m, "with keys:", MapKeys[int, string](m1))

map[1001:Aaron 1002:Ab 1003:Abbas 1004:Abbot] with keys: [1001 1002 1003 1004]

定义结构体

type Element[T any] struct {val  Tnext *Element[T]
}type List[T any] struct {head, tail *Element[T]
}

这是一个链表,链表里可放不同类型的元素。

func (lst *List[T]) Push(v T) {if lst.tail == nil {lst.head = &Element[T]{val: v}lst.tail = lst.head} else {lst.tail.next = &Element[T]{val: v}lst.tail = lst.tail.next}
}func (lst *List[T]) GetAll() []T {var elems []Tfor e := lst.head; e != nil; e = e.next {elems = append(elems, e.val)}return elems
}

这里定义了链表的方法,分别用于追加元素和获取所有元素。
从这里可以看出,链表的类型是List[T]。

lst := List[int]{}
lst.Push(10)
lst.Push(13)
lst.Push(23)
fmt.Println("list:", lst.GetAll())

list: [10 13 23]

这篇关于Generics的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703746

相关文章

springboot整合tk-mybatis时报错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to

出现这种错误是因为配置扫描mapper的时候扫描到了BaseMapper,把它从指定的扫描路径中迁移出去就行了,框架类的文件单独建一个路径: 总之就是要扫描mapper的时候只扫描业务mapper,不要扫描到BaseMapper.

sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

主要代码:         private Class<T> beanClass;@SuppressWarnings("unchecked")public BaseDaoImpl() {ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();beanClass=(C

【.NET Core】泛型(Generics)详解

【.NET Core】泛型(Generics)详解 文章目录 【.NET Core】泛型(Generics)详解一、概述二、泛型类型参数三、泛型中类型参数的约束3.1 where T:struct3.2 where T:class3.3 where T:class?3.4 where T:notnull3.5 where T:default3.6 where T:unmanaged3.7

20:kotlin 类和对象 --泛型(Generics)

类可以有类型参数 class Box<T>(t: T) {var value = t} 要创建类实例,需提供类型参数 val box: Box<Int> = Box<Int>(1) 如果类型可以被推断出来,可以省略 val box = Box(1) 通配符 在JAVA泛型中有通配符?、? extends E、? super E,在kotlin中没有这个概念,取而代之的是Dec

8.泛型(generics)

//泛型function echo<T>(arg: T): T {return arg}const result = echo(true)function swap<T, U>(tuple: [T, U]): [U, T] {return [tuple[1], tuple[0]]}const result2 = swap(['string', 123])//约束泛型interface

rust学习——泛型 (Generics)

文章目录 泛型 Generics泛型详解结构体中使用泛型枚举中使用泛型方法中使用泛型为具体的泛型类型实现方法 const 泛型(Rust 1.51 版本引入的重要特性)const 泛型表达式 泛型的性能 泛型 Generics Go 语言在 2022 年,就要正式引入泛型,被视为在 1.0 版本后,语言特性发展迈出的一大步,为什么泛型这么重要?到底什么是泛型?Rust

Generics/泛型, ViewBuilder/视图构造器 的使用

1. Generics 泛型的定义及使用   1.1 创建使用泛型的实例 GenericsBootcamp.swift import SwiftUIstruct StringModel {let info: String?func removeInfo() -> StringModel{StringModel(info: nil)}}struct BoolModel {let info: B

Generics/泛型, ViewBuilder/视图构造器 的使用

1. Generics 泛型的定义及使用   1.1 创建使用泛型的实例 GenericsBootcamp.swift import SwiftUIstruct StringModel {let info: String?func removeInfo() -> StringModel{StringModel(info: nil)}}struct BoolModel {let info: B

Java语言与Generics

一 Generics简介Generics是程序设计语言的一种技术,指将程序中数据类型进行参数化,它本质上是对程序的数据类型进行一次抽象,扩展语言的表达能力,同时支持更大粒度的代码复用。对于一些数据类型参数化的类和方法来说,它们往往具有更好的可读性、可复用性和可靠性。在设计集合类和它们的抽象操作时,往往需要将它们定义为与具体数据类型无关,在这种情况下,使用Generics就是非常适合的。举例来