首页 > 其他分享 >Golang面试:泛型

Golang面试:泛型

时间:2024-07-03 15:08:43浏览次数:17  
标签:map 示例 fmt GetKeys Golang 类型 面试 泛型

Go语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。

1. 泛型的基本概念

泛型允许你定义可以处理多种数据类型的函数和数据结构,而无需为每种类型编写单独的代码。通过使用类型参数,你可以编写一次代码,然后在不同的上下文中重用它。

2. 类型参数

类型参数是泛型的核心。你可以在函数、结构体和接口中使用类型参数。类型参数在声明时使用方括号[]括起来,并且可以有一个或多个类型参数。

3. 类型约束

类型约束用于限制类型参数可以接受的类型。Go提供了几种类型约束:

  • any:表示任意类型。
  • comparable:表示可以进行比较的类型(支持==!=操作)。
  • 可以定义自定义类型约束:
package main

import "fmt"

// 定义一个自定义类型约束
type Number interface {
	int | float64
}

// 使用自定义类型约束的泛型函数
func Add[T Number](a, b T) T {
	return a + b
}

func main() {
	fmt.Println(Add(1, 2))       // 输出: 3
	fmt.Println(Add(1.5, 2.3))   // 输出: 3.8
}

在这个示例中,Number接口定义了一个自定义类型约束,表示intfloat64类型。

4. 泛型的使用场景

泛型在以下场景中特别有用:

  • 集合操作:例如,处理不同类型的列表、集合和映射。
  • 算法实现:例如,排序、搜索和数学运算。
  • 数据结构:例如,栈、队列和树。
  • 通用库:例如,通用的工具函数和数据处理库。

5. 注意事项

  • 性能:泛型可能会引入一些性能开销,特别是在编译时和运行时的类型检查和转换。
  • 复杂性:泛型代码可能会增加代码的复杂性,特别是在类型约束和类型参数的使用上。

6. 示例

创建一个泛型函数,该函数可以接受任何类型的map并返回其键的列表。为了实现这一点,我们需要定义一个泛型类型参数来表示map的键和值的类型。

package main

import (
	"fmt"
)

// GetKeys 返回给定 map 的所有键的切片
func GetKeys[K comparable, V any](m map[K]V) []K {
	keys := make([]K, 0, len(m))
	for k := range m {
		keys = append(keys, k)
	}
	return keys
}

func main() {
	// 示例 1:map[string]int
	map1 := map[string]int{
		"one": 1,
		"two": 2,
		"three": 3,
	}
	keys1 := GetKeys(map1)
	fmt.Println("Keys of map1:", keys1)

	// 示例 2:map[int]string
	map2 := map[int]string{
		1: "one",
		2: "two",
		3: "three",
	}
	keys2 := GetKeys(map2)
	fmt.Println("Keys of map2:", keys2)

	// 示例 3:map[float64]bool
	map3 := map[float64]bool{
		1.1: true,
		2.2: false,
		3.3: true,
	}
	keys3 := GetKeys(map3)
	fmt.Println("Keys of map3:", keys3)
}

说明

  1. 定义泛型函数
    • 函数GetKeys使用两个类型参数KV,其中K表示map的键类型,V表示map的值类型。
    • K需要实现comparable接口,因为map的键必须是可比较的。
    • V可以是任何类型,因此使用any作为类型约束。
  2. 获取键列表
    • 函数中,创建一个切片keys用于存储map的键。
    • 通过遍历map,将每个键添加到keys切片中。
    • 最后返回keys切片。
  3. 示例用法
    • main函数中,定义了三个不同类型的map,并调用GetKeys函数获取它们的键列表。
    • 打印每个map的键列表以验证结果。

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特


标签:map,示例,fmt,GetKeys,Golang,类型,面试,泛型
From: https://www.cnblogs.com/lianshuiwuyi/p/18281667

相关文章

  • Golang开发:构建支持并发的网络爬虫
    Golang开发:构建支持并发的网络爬虫随着互联网的快速发展,获取网络数据成为了许多应用场景中的关键需求。网络爬虫作为一种自动化获取网络数据的工具,也因此迅速崛起。而为了应对日益庞大的网络数据,开发支持并发的爬虫成为了必要的选择。本文将介绍如何使用Golang编写一个支持......
  • 昨天的面试问题
    1、之前面试的时候,面试官说了在异步更新UI不用使用Dispatcher.CurrentDispatcher.Invoke我之前倒没注意,或者说知识浅薄,不知道,<StackPanel><ButtonContent="执行耗时任务"Margin="20"Command="{BindingProgressCommand}"></Button>......
  • 腾讯微信事业部面试总结
    文章目录引言一面——6/25面试内容算法题结果二面——7/3闲聊部分面试内容算法题反问结果总结引言投腾讯还是很没底的,这是因为之前一个师兄和我说这边在补录,然后缺人缺的比较厉害,所以才投的,技术栈并不匹配,主要是的写C++和左右客户端的,但是我准备的都是java和后端......
  • 【Java完整版 面试必备】Leetcode Top100题目和答案-矩阵篇
    目录以下摘自leetcodeTop100精选题目-矩阵篇​矩阵置零螺旋矩阵旋转图像搜索二维矩阵II以下摘自leetcodeTop100精选题目-矩阵篇矩阵置零给定一个 mxn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例:输入:matrix......
  • 百度的面试,你觉得难度怎么样?
    面经详解操作系统处理死锁的方法首先我们来了解一下什么是死锁:死锁(Deadlock):是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。称此时系统处于死锁状态或系统产生了死锁。产生死锁的必要条件互斥条件不可剥夺......
  • 面试官:JVM调优,主要针对是哪一个区域?JVM内存结构是怎样的?
    作为一个Java程序员,在日常的开发中,不必像C/C++程序员那样,为每一个内存的分配而操心,JVM会替我们进行自动的内存分配和回收,方便我们开发。但是一旦发生内存泄漏或者内存溢出,如果对Java内存结构不清楚,那将会是一件非常麻烦的事情!本文笔者将为大家详解Java内存结构。面试tips聊聊......
  • 面试题:Linux 系统基础提问 (一)
    Linux系统中如何管理用户和组?Linux系统中用户和组的管理通常包括以下几个方面:1、创建用户和组:使用useradd和groupadd命令创建新用户和新组。2、修改用户和组信息:使用usermod和groupmod命令来修改用户和组的信息。3、删除用户和组:使用userdel和groupdel命令来删除用户和组。......
  • Python面试题:Python 中的列表和元组有什么区别?
    Python中的列表和元组的主要区别如下:可变性:列表(List):可变,意味着可以改变列表的内容(添加、删除或修改元素)。元组(Tuple):不可变,一旦创建后,不能修改其内容。语法:列表使用方括号[]创建。例如:my_list=[1,2,3]元组使用圆括号()创建。例如:my_tuple=(1,2,3)性能:......
  • Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire
    一、前言线上项目往往依赖非常多的具备特定能力的资源,如:DB、MQ、各种中间件,以及随着项目业务的复杂化,单一项目内,业务模块也逐渐增多,如何高效、整洁管理各种资源十分重要。本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构&DDD等设计思想的落地,起到的支撑作用。......
  • 面试:10亿数据如何最快速插入MySQL?
    转载:https://mp.weixin.qq.com/s/kL1srP3FZjaTSXLULsUS5g 最快的速度把10亿条数据导入到数据库,首先需要和面试官明确一下,10亿条数据什么形式存在哪里,每条数据多大,是否有序导入,是否不能重复,数据库是否是MySQL?假设和面试官明确后,有如下约束10亿条数据,每条数据1Kb数据内容......