阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

简单介绍Go 语言常见的一些坑

277次阅读
没有评论

共计 1630 个字符,预计需要花费 5 分钟才能阅读完成。

导读 本文会列举一些在 Go 面试中常见的问题。
切片循环问题

For 循环在我们日常编码中可能用的很多。在很多业务场景中我们都需要用 for 循环处理。但 golang 中的 for 循环在使用上需要注意一些问题,大家可否遇到。先看下边这一段代码:

func testSlice() {a := []int64{1,2,3} 
    for _, v := range a {go func() {fmt.Println(v) 
        }()} 
     
    time.Sleep(time.Second) 
} 
 
output: 3 3 3

那么为什么会输出的是这个结果呢?

在 golang 的 for 循环中,循环内部创建的函数变量都是共享同一块内存地址,for 循环总是使用同一块内存去接收循环中的的 value 变量的值。不管循环多少次,value 的内存地址都是相同的。我们可以测试一下:

func testSliceWithAddress() {a := []int64{1,2,3} 
    for _, v := range a {go func() {fmt.Println(&v) 
        }()} 
 
    time.Sleep(time.Second) 
} 
 
output: 
        0xc0000b2008 
        0xc0000b2008 
        0xc0000b2008

符合预期。如果大家比较感兴趣的话可以去将这段代码的汇编打印出来,就可以发现循环的 v 一直在操作同一块内存。

同样的,在 slice 循环这块我们还会遇见另一个有趣的地方,大家可以看看下边这段代码输出什么?

func testRange3() {a := []int64{1,2,3} 
    for _, v := range a {a = append(a, v) 
    } 
 
    fmt.Println(a) 
}

这段代码的输出结果是:[1 2 3 1 2 3],为什么呢? 因为 golang 在循环前会先拷贝一个 a,然后对新拷贝的 a 进行操作,所以循环的次数不会随着 append 而增多。

interface 和 nil 比较

比如返回了一个空指针,但并不是一个空 interface

func testInterface() {doit := func(arg int) interface{} {var result * struct{} = nil 
        if arg > 0 {result = &struct{}{}} 
 
        return result 
    } 
 
    if res := doit(-1); res != nil {fmt.Println("result:", res) 
    } 
}

输出结果为:result:,为什么呢? 因为在 go 里边变量有类型和值两个属性,在比较的时候也会比较类型和值都相同才会认为相等。代码中 result 的类型是指针,值是 nil,所以会有这样的输出。

可变参数是空接口类型

当参数的可变参数是空接口类型时,传入空接口的切片时需要注意参数展开的问题。

func testVolatile() {var a = []interface{}{1, 2, 3} 
 
    fmt.Println(a) 
    fmt.Println(a...) 
} 
输出结果为:[1 2 3] 
1 2 3

map 遍历时顺序不固定

不要相信 map 的顺序!

func testMap() {m := map[string]string{ 
        "a": "a", 
        "b": "b", 
        "c": "c", 
    } 
 
    for k, v := range m {println(k, v) 
    } 
}

具体原因大家可以看一下源码:map.go:mapiterinit,就会发现下边这个代码用来决定从哪开始遍历 map。另一个原因是 map 在某些特定情况下 (例如扩容),会发生 key 的搬迁重组。而遍历的过程,就是按顺序遍历 bucket,同时按顺序遍历 bucket 中的 key。搬迁后,key 的位置发生了重大的变化,所以遍历 map 的结果就不可能按原来的顺序了。

func mapiterinit(t *maptype, h *hmap, it *hiter) { 
        ...... 
    // decide where to start 
    r := uintptr(fastrand()) 
        ...... 
}

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1630字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7804935
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025 年 11 月 28 日 -Cloudflare 史诗级事故: 一次配置失误,引爆全球宕机 前言 继今...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...