golang指针和值类型在map key中的可用性

指针和值类型均可作为map key,前提是可比较;值类型需所有元素可比较,指针比较地址而非指向的值,不可比较类型如slice、map、function等不能作key。

golang指针和值类型在map key中的可用性

在 Go 语言中,map 的 key 必须是可比较的类型。这意味着只有那些支持 ==!= 操作的类型才能作为 map 的 key。指针和值类型的可用性取决于它们的具体类型以及是否满足“可比较”这一条件。

值类型作为 map key

大多数常见的值类型都可以作为 map 的 key:

整型(int, uint, int8, uint64 等) 浮点型(float32, float64) 字符串(string) 布尔型(bool) 复数类型(complex64, complex128) 数组(array),前提是元素类型可比较 结构体(struct),所有字段都可比较

例如:

var m1 = map[int]string{1: "a"}var m2 = map[[2]int]bool{{1,2}: true}type Point struct { X, Y int }var m3 = map[Point]string{{0,0}: "origin"}

指针类型作为 map key

指针类型本身是可比较的,因此可以作为 map 的 key。两个指针相等当且仅当它们指向同一个地址,或者都为 nil。

立即学习“go语言免费学习笔记(深入)”;

示例:

a := 42b := 42pa := &apb := &bm := map[*int]string{    pa: "first pointer",    pb: "second pointer",}// 即使 *pa == *pb,但 pa != pb,所以它们是不同的 key

这说明:指针作为 key 是基于内存地址判断相等性,而不是所指向的值。

哪些类型不能作为 map key

以下类型不可比较,因此不能作为 map 的 key

slice map function channel 包含不可比较字段的 struct 或 array

比如下面这些会编译报错:

// 编译错误:[]int 不可比较var m1 = map[[]int]string{}// 编译错误:map[int]int 不可比较var m2 = mapint]string{}// 编译错误:包含 slice 的 structtype BadKey struct {    Data []int}var m3 = map[BadKey]string{}

小结与建议

使用指针或值类型作为 map key 时注意:

值类型只要其内部所有元素都可比较,就可以做 key 指针可以做 key,比较的是地址而非值内容 避免用指向动态分配对象的指针做 key,除非你明确需要按地址区分 若想根据“值相等”来查找,应使用值类型而非指针

基本上就这些,不复杂但容易忽略细节。

以上就是golang指针和值类型在map key中的可用性的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1411710.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月16日 04:26:43
下一篇 2025年12月16日 04:26:51

相关推荐

  • Go语言中存储多个字节切片的正确姿势

    本文深入探讨了go语言中如何正确存储和管理多个字节切片(`[]byte`)。针对常见的将多个字节切片错误地连接成一个大字节切片的问题,文章明确指出应使用`[][]byte`类型来声明存储结构,以确保每个独立的字节切片都能被单独保存和访问。教程将通过示例代码演示如何修改结构体定义,并提供实际应用中的最…

    好文分享 2025年12月16日
    000
  • Go语言中存储多个字节切片:[][]byte 的正确使用姿势

    在go语言编程中,我们经常需要处理字节数据。当面对需要存储多个独立的字节切片(`[]byte`)的场景时,例如存储多个压缩后的数据块、文件片段或网络消息,选择正确的数据结构至关重要。本文将深入探讨如何高效且准确地实现这一目标,避免常见的陷阱,并提供一个完整的实践案例。 理解 []byte 与 [][…

    2025年12月16日
    000
  • Go 项目中测试文件的组织、递归执行与最佳实践

    本文探讨了 go 语言项目中测试文件(_test.go)的组织方式,包括将其放置在子目录中的可行性及其潜在影响。我们将介绍如何使用 go test ./… 命令递归执行测试,并分析将测试文件置于子目录的优缺点。此外,文章还将阐述 go 社区推荐的测试文件放置策略,以及 go 1.20+ …

    2025年12月16日
    000
  • Go语言切片原地反转教程

    本文旨在澄清go语言中切片反转的常见误区,特别是对`sort.reverse`的错误理解。我们将详细介绍一种高效且惯用的原地反转go切片的方法,通过双指针交换实现,无需额外分配内存,确保数据结构的原始顺序被颠倒。 Go语言切片反转的核心原理 在Go语言中,实现切片(slice)的反转是一个常见的操作…

    2025年12月16日
    000
  • Golang如何使用策略模式实现可插拔算法_Golang策略模式可插拔算法实践详解

    策略模式通过接口封装不同算法,实现运行时动态切换。Go中以SortStrategy接口定义排序行为,BubbleSort和QuickSort分别实现具体算法,Sorter作为上下文持有策略并执行,支持灵活替换排序方式,避免条件判断,提升扩展性与维护性。 在Go语言开发中,策略模式是一种常用的设计模式…

    2025年12月16日
    000
  • 将HTML表单值转换为Go语言中的整数

    本文将介绍如何使用Go语言将HTML表单提交的字符串值转换为整数类型。重点讲解`strconv.ParseInt`函数的使用方法,以及如何正确处理该函数可能返回的错误,确保程序的健壮性和可靠性。通过本文,你将掌握从表单获取数据并进行类型转换的常见技巧。 在Go语言中,处理HTML表单数据时,经常需要…

    2025年12月16日
    000
  • Go 语言中反转数组的几种方法

    本文介绍了在 Go 语言中反转数组的几种有效方法,重点介绍了一种简洁高效的原地反转算法,并提供了完整的代码示例。同时,也简要提及了利用 `sort.Reverse` 函数进行反转的方式,但强调了其适用性和效率问题,旨在帮助开发者选择最合适的反转方案。 在 Go 语言中,反转数组是一个常见的操作。虽然…

    2025年12月16日
    000
  • 如何在Golang中实现简单的请求统计与监控_Golang请求统计监控项目实战汇总

    答案:通过中间件记录请求路径、耗时和状态码,结合原子操作统计请求数与错误数,使用Prometheus客户端库注册指标并暴露/metrics接口,实现请求监控与可视化分析。 在Go语言开发中,实现简单的请求统计与监控可以帮助我们了解服务的运行状态,比如每秒请求数、响应时间、错误率等。这类功能不需要引入…

    2025年12月16日
    000
  • Golang smtp.SendMail阻塞问题:深度解析与TLS连接解决方案

    本文深入探讨golang中`smtp.sendmail`函数可能出现的阻塞和连接超时问题。核心原因在于smtp服务器与客户端在tls连接协商上的不匹配,特别是当服务器默认要求tls连接而`sendmail`尝试通过`starttls`升级失败时。文章将提供两种主要解决方案:一是通过`tls.dial…

    2025年12月16日
    000
  • 深入理解Go语言sync.WaitGroup的正确使用与并发控制

    sync.waitgroup是go语言中用于并发控制的重要工具,它能有效协调多个goroutine的执行,确保主goroutine在所有子goroutine完成后再继续。本文将详细阐述waitgroup的核心机制,包括add()、done()和wait()的正确使用方法,并强调wg.add()必须在…

    2025年12月16日
    000
  • Go 语言中高效反转切片(数组)的方法

    本文详细介绍了在 go 语言中如何高效地反转切片(或数组)的元素顺序。我们将探讨一种简洁且常用的双指针交换算法,避免了对 `sort.reverse` 等排序相关功能的误用,直接实现原地反转。通过具体代码示例,读者将掌握在 go 语言中实现切片反转的最佳实践。 在 Go 语言开发中,我们经常会遇到需…

    2025年12月16日
    000
  • Go语言中整数到浮点数(float64)的转换教程

    在go语言中,将整数类型转换为浮点数类型(如`float64`)需要使用显式类型转换。本文将详细介绍如何通过简单的类型断言操作实现这一过程,并提供代码示例,帮助开发者理解go语言的强类型特性及其在数值转换中的应用。 Go语言中的类型系统与浮点数 Go语言是一种静态类型语言,对数据类型有严格的要求。这…

    2025年12月16日
    000
  • Go语言:字符串遍历与字符(Rune)处理指南

    在go语言中,直接索引字符串会得到字节值,而通过`for…range`循环遍历字符串时,第二个返回值是unicode码点(rune)。本文将详细介绍如何在go语言中正确地遍历字符串,获取并处理其字符值,而非原始的字节或数字表示,并通过示例代码演示如何将rune类型转换为可读的字符字符串,…

    2025年12月16日
    000
  • Go语言可变参数函数:灵活处理不定数量的函数参数

    go语言通过可变参数函数支持处理不定数量的函数参数,其语法为在参数类型前使用 `…` 符号(例如 `…int`)。在函数内部,这些参数被作为一个对应类型的切片(slice)来处理,从而实现高度灵活的函数定义和调用。 引言:理解可变参数函数 在编程中,我们经常会遇到需要定义一个…

    2025年12月16日
    000
  • Go语言中的可变参数函数:语法与实践

    本文详细介绍了go语言中可变参数函数的定义与使用。通过`…type`语法,开发者可以创建接受不定数量同类型参数的函数,这些参数在函数内部将作为对应类型的切片处理,从而实现高度灵活的函数设计。文章包含示例代码、关键用法及注意事项,帮助读者掌握go语言的可变参数机制。 在Go语言中,有时我们…

    2025年12月16日
    000
  • Go语言:深入理解uint8到字符串的转换

    在Go语言中,将uint8类型(即byte)转换为其十进制字符串表示是一个常见需求,尤其是在处理字符串的单个字符或字节数据时。本文将详细解释为何直接使用strconv.Itoa会导致类型错误,并提供正确的解决方案,即通过显式类型转换将uint8转换为int,确保代码的正确性和健壮性。 1. 理解Go…

    2025年12月16日
    000
  • Golang如何使用reflect操作interface类型_Golang reflect interface类型操作实践

    答案是:Go中interface{}可存储任意类型,结合reflect包可在运行时获取类型和值信息,实现通用数据处理。通过reflect.TypeOf()和reflect.ValueOf()解析interface{}的底层类型与值,遍历结构体字段、读取tag、修改导出字段需传入指针并调用Elem()…

    2025年12月16日
    000
  • Go语言:使用compress/gzip高效压缩字符串数据

    本文详细介绍了如何在go语言中使用`compress/gzip`标准库对字符串数据进行gzip压缩。通过结合`bytes.buffer`和`gzip.writer`,您可以轻松地将字符串内容压缩并存储到内存字节切片中。文章将提供清晰的示例代码,并讲解如何设置压缩级别及处理常见的错误,帮助开发者高效地…

    2025年12月16日
    000
  • Go 语言可变参数函数:定义、使用与最佳实践

    go 语言通过可变参数(variadic parameters)机制,允许函数接受不定数量的同类型参数。本文将详细介绍如何在 go 中定义和使用可变参数函数,阐明其语法特点,并提供实用的代码示例,帮助开发者灵活处理输入参数数量不确定的场景,提升代码的通用性和可维护性。 什么是可变参数函数? 在编程中…

    2025年12月16日
    000
  • Go语言中big.Int到自定义进制字符串转换的实践与限制

    本文探讨了在go语言中将`big.int`转换为自定义进制字符串的需求,特别是对非导出函数`nat.string`的访问尝试。我们解释了go语言中非导出函数的访问限制,并提供了一个使用`strconv.formatint`的实用替代方案。同时,文章强调了该方案在处理超出`int64`范围的`big.…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信