当前位置: 首页 > wzjs >正文

重庆网站设计开发炫酷网站界面设计

重庆网站设计开发,炫酷网站界面设计,网站建设工作整改报告,家居网站建设策划开发Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中 map 的 key 类型支持情况,帮助你在面试中稳扎稳打。


一、Go 中 map 的基本语法

Go 语言中的 map 是一种内建的数据结构,用于存储键值对:

m := map[string]int{"apple":  5,"banana": 10,
}

map 的定义语法:

map[KeyType]ValueType

本文的重点就是 KeyType 的限制与规范。


二、哪些类型可以作为 map 的 key?

Go 语言规定:可以作为 map key 的类型必须是可比较的(comparable)类型。

✅ 可作为 map key 的类型包括:

1. 内建的基本类型:
  • bool
  • intint8int16int32int64
  • uintuint8uint16uint32uint64
  • uintptr
  • float32float64
  • complex64complex128
  • string
2. 指针类型(包括函数指针):
  • 所有指针类型都可以比较,因此也可以作为 key。
m := make(map[*int]string)
3. 接口类型(interface):
  • interface 类型本身是可比较的,只要其动态类型和值都是可比较的。
var m map[interface{}]string

⚠️注意:如果将一个包含不可比较类型的值放入 interface{} 作为 key,会 panic。

4. 自定义类型(满足以下条件):
  • 如果你自定义的类型底层是可比较类型,如结构体(struct),则只要 所有字段 都是可比较的,该 struct 类型就可以作为 map key。
type Point struct {X, Y int
}m := make(map[Point]string)  // ✅ 合法

三、哪些类型不可以作为 map 的 key?

Go 编译器会严格检查 key 类型是否可比较,以下是一些常见不可作为 map key 的类型

❌ 不可作为 key 的类型包括:

1. 切片(slice)
m := make(map[[]int]string) // ❌ 编译错误:invalid map key type []int

切片是引用类型,底层元素可变,不能进行恒等比较。

2. 映射(map)
m := make(map[map[string]int]string) // ❌ 编译错误

map 是引用类型,内部结构可变,不可比较。

3. 函数类型(function)
m := make(map[func() string]string) // ❌ 编译错误

函数值是不可比较的。

4. 包含不可比较字段的结构体
type Person struct {Name stringTags []string  // ❌ slice 是不可比较的
}m := make(map[Person]int) // ❌ 编译错误

结构体中只要有一个字段不可比较,该结构体就无法作为 key。


四、如何判断一个类型是否可作为 key?

你可以使用以下三条规则判断:

  1. 类型是否支持 ==!= 操作;
  2. 类型是否是 slice、map、function(这三类一定不能);
  3. 如果是 struct,检查其字段是否都满足比较条件。

五、总结

类型是否可作为 key说明
int / string / bool内建可比较类型
float / complex虽可比较,但要注意精度陷阱
pointer / chan / interface只要指向或包含的值可比较
array所有元素类型可比较时可用
struct✅ / ❌所有字段必须可比较
slice / map / func天然不可比较

六、常见面试 follow-up 问题

  • Q:interface{} 作为 key 有什么陷阱?

    • A:interface{} 本身可以比较,但它包含的值若不可比较,会在运行时 panic。
  • Q:map[float64]string 可以吗?

    • A:可以。但要小心浮点数精度问题,例如 0.1 + 0.2 != 0.3,可能会导致 key 匹配异常。
  • Q:如何用 slice 做 key?

    • A:不能直接做 key,但你可以将 slice 转换为 string(如 JSON 序列化、或者用 strings.Join)作为 key。

结语

理解 map key 的限制,不仅能帮助你避免常见的编译错误与运行时 panic,也是在 Golang 面试中体现你对语言底层理解的重要体现。熟练掌握之后,设计更合理的数据结构和优化程序性能也将变得更加得心应手。


文章转载自:

http://Vk8FjDVI.npbkx.cn
http://OM14q02P.npbkx.cn
http://XnRH3lN2.npbkx.cn
http://BmNHvbNe.npbkx.cn
http://UfgBxZBn.npbkx.cn
http://mHN6fC06.npbkx.cn
http://md2zXvel.npbkx.cn
http://yHig2n7R.npbkx.cn
http://th1bwEI0.npbkx.cn
http://NWWzfsP9.npbkx.cn
http://4ODO1IQt.npbkx.cn
http://a4wnd1YB.npbkx.cn
http://AjAp95zE.npbkx.cn
http://NhXQr8RC.npbkx.cn
http://BtQsBsme.npbkx.cn
http://Lb8X7abC.npbkx.cn
http://xLwFs8be.npbkx.cn
http://znyvEarl.npbkx.cn
http://0eD0xHkM.npbkx.cn
http://7jJVBF7X.npbkx.cn
http://W6I6WKcs.npbkx.cn
http://liGTeKMv.npbkx.cn
http://3LrRTpfw.npbkx.cn
http://z739SRwM.npbkx.cn
http://7Krw4Eg6.npbkx.cn
http://RdwWLoTl.npbkx.cn
http://DWcJpm7u.npbkx.cn
http://6PZVEBvS.npbkx.cn
http://W59eUReo.npbkx.cn
http://JkAAZmMC.npbkx.cn
http://www.dtcms.com/wzjs/632880.html

相关文章:

  • 网站建设合同属于印花税的哪个税目专门做外贸网站有哪些
  • 网站关键词代码位置seo优化外包
  • 厦门外贸网站找谁上海网页设计公司哪儿济南兴田德润有活动吗
  • 滁州网站建设费用物流网站建设网
  • 网页设计模板免费下载网站响应式网站适合用什么框架做
  • 网站开发与设计需要哪些技术未来中森网站建设咨询
  • 建站页面整人关不掉的网站怎么做
  • 如何建立自己的商城网站做网站的前途怎么样
  • 番禺网站开发设计欧美网站模板下载
  • 申请做网站东莞建设网站推广公司地址
  • 网站上的缩略图怎么做清晰ih5 做视频网站
  • dede 网站地图 插件wordpress 网易云
  • 网络营销就是建立企业网站wordpress图片二级域名
  • 企业网站不被百度收录贸易网站设计
  • 网站开发线框网站开发是用什么语言
  • 百度seo培训公司东莞seo优化公司
  • 建立网站 wordpress软件开发工作稳定吗
  • 百度提交网站的入口地址做婚纱网站的步骤
  • 公司网站开发说明介绍wordpress 前端 修改
  • 网站开发教程公司手机网站排名优化
  • 软文推广网站做网站有多赚钱
  • 建立手机也可浏览的网站教程中国铁建网站
  • 合肥网站建设步骤正规网站备案代理
  • 竹子建站怎么赚钱wordpress公众号验证码
  • 邢台手机网站建设价格成都搜索优化整站优化
  • 手机网站弹出层插件有哪些网页设计中所需要的素材
  • 专业网站设计建设服务wordpress简洁设置
  • 苏宁网站建设房产网排名
  • 帝国cms网站搬家教程龙口市最新公告
  • 创美艺佳网站是谁做的域名解析到本地服务器