0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在学习go语言的过程踩过的坑

马哥Linux运维 来源:马哥Linux运维 2024-11-11 09:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作为一个5年的phper,这两年公司和个人都在顺应技术趋势,新项目慢慢从php转向了go语言,从2021年到现在,笔者手上也先后开发了两个go项目。在学习go语言的过程中也学习并总结了一些相关的东西,这篇文章就分享下自己踩过的一些坑吧。

1、函数的写法

问题:

func main()
{
fmt.Println("php是世界上最好的语言")
}

解决:
如上所示,这种函数的定义写法,在go语言中是错误的,就是 "{" 必须得和函数名在同一行。当然,这种错误在编辑器检测语法的时候就会暴露出来了,正确写法应该如下所示:

func main() {
fmt.Println("php是世界上最好的语言")
}

2、map定义和初始化

问题:

func main() {
var m map[string]string
m["php"] = "世界上最好的语言"
m["go"]  = "世界上最好的语言"
fmt.Println(m)
}

解决:
如上所示,这种定义了map,然后直接使用的方式是错误的,会抛出一个panic。少了一个重要的步骤,必须使用make()函数去给map分配内存空间,才能使用。这个对于phper来说,刚开始可能会经常忘掉。正确使用方式如下:

func main() {
m := make(map[string]string, 2)
m["php"] = "世界上最好的语言"
m["go"]  = "世界上最好的语言"
fmt.Println(m)
}

3、json格式转换

问题:

type Student struct {
id    int
name  string
score int
}

func main() {
s := Student{1, "小明", 99}
jsonS, _ := json.Marshal(s)
fmt.Println(string(jsonS))
}

解决:
在做web开发过程中,基本上每天都要和json格式数据打交道,所以学会转换成json格式的数据是必备技能啊。但上面的写法是错误的,打印出来的为空值。这是因为Student结构体中的元素都是小写的,对外是不可访问的,所以必须改成大写的,才能对外输出json格式的数据。正确写法如下:

type Student struct {
Id    int
Name  string
Score int
}

func main() {
s := Student{1, "小明", 99}
jsonS, _ := json.Marshal(s)
fmt.Println(string(jsonS))
}

4、循环中处理业务问题

问题:

func main() {
data := []int{1, 2, 3}
for _, value := range data {
value += 1
}
fmt.Println(data)
}

解决:
如上所示,我们本身是想对data里面的元素做加1操作的,但发现没有成功。那是因为,我们循环所引用的变量是临时变量,去修改的时候并不会改变数组中的原有结构。正确的做法应该是根据切片的索引去修改,其实就类似于php的foreach,改变数组中的值,也是需要根据索引去改的。如下所示:

func main() {
data := []int{1, 2, 3}
for key := range data {
data[key] += 1
}
fmt.Println(data)
}

5、数组和切片的区别

问题:

func change(data [2]int) {
data[0] = 4
}

func main() {
data := [2]int{1, 2}
change(data)
fmt.Println(data)
}

解决:
如上所示,运行的结果是[1 2] ,而不是[4 2] 。原因是main方法中声明的data是数组,而go语言中的参数传递是值传递,所以不会改变原有的数组值。如果需要实现上述效果,可以改用切片,因为切片本身不会存储数据,他的底层数据会指向一个底层数组,因此在修改切片的元素时,会修改底层数组的相应元素,同时共享同一个底层数组的切片也会相应修改。正确做法如下所示:

func change(data []int) {
data[0] = 4
}

func main() {
data := []int{1, 2}
change(data)
fmt.Println(data)
}

6、:= 声明和初始化变量

问题:

func main() {
flag := 1
if true {
flag := 2
flag++
}
fmt.Println(flag)
}

解决:
如上所示,运行结果仍然是1,而不是2或者3。上述代码中,flag := 2,又重新声明了一个变量flag,但它作用的仅仅是if 判断逻辑里面的,并没有作用到整个main函数全局中。如果要正确影响,应将 := 改为 =,如下所示,结果则为3:

func main() {
flag := 1
if true {
flag = 2
flag++
}
fmt.Println(flag)
}

总结:以上,就是本人在实际开发中,结合自己所学,遇到的一些比较常见的坑点了。当然,也是比较基础的一些点。后面,我也会继续深入学习go,总结更多的经验!

一个人可以被毁灭,但不可以被打败。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4423

    浏览量

    68074
  • go语言
    +关注

    关注

    1

    文章

    161

    浏览量

    9883

原文标题:go新手常踩的坑

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    实测不!罗德与施瓦茨FSP3,射频发烧党的刚需主力机

    玩射频也有好几年了,从入门级的入门机型换到中高端旗舰,不少,也摸过不少经典款。今天就来聊聊我自用大半年的罗德与施瓦茨FSP3,实打实的实测感受,没有虚标吹捧,全是发烧党关心的干货,适合刚入
    的头像 发表于 04-25 15:11 682次阅读
    实测不<b class='flag-5'>踩</b><b class='flag-5'>坑</b>!罗德与施瓦茨FSP3,射频发烧党的刚需主力机

    光耦失效的N种现场!工程师都

    在电子电路设计中,光电耦合器(光耦)凭借电气隔离、信号传输、抗干扰等核心优势,成为电源、工控、汽车电子、医疗设备等领域不可或缺的基础器件。它看似结构简单、应用便捷,却藏着无数容易被忽略的“陷阱”,几乎每位硬件工程师都在光耦上过失效的
    的头像 发表于 04-23 11:18 466次阅读
    光耦失效的N种现场!工程师都<b class='flag-5'>踩</b><b class='flag-5'>过</b>的<b class='flag-5'>坑</b>

    BSP调试#05:MIPI DSI(RK3588)

       本合集的是我当初调试 RK3588 平台时的 原始笔记 ——只保留了那些的问题接口,没出过问题的内容全删掉了。文章框架如下: 其中, “调试过程” 章节可能有点意思(记录了
    的头像 发表于 04-17 11:54 9026次阅读
    BSP调试#05:MIPI DSI(RK3588)

    深耕电路板加工8年,从到精通,这些实操经验帮你少走90%弯路

    大家好,从事电路板(PCB)加工行业整整13年,从最初跟着师傅学习的学徒,到现在能独立负责从样品打样到批量量产的全流程,期间、总结的经验,今天一次性分享给大家——无论你是刚入行
    发表于 04-16 09:31

    PCB颜色选购避指南:别再被&quot;黑色高端&quot;忽悠了!

    做硬件这么多年,发现很多新手甚至部分老工程师选PCB颜色都:觉得黑色更高端、蓝色更好看、紫色更个性,结果投产之后要么良率暴跌,要么成本翻倍,最后还是老老实实换回绿色。今天就把PCB颜色选择的底层逻辑说透,看完再也不会
    的头像 发表于 03-26 14:06 300次阅读

    N沟道 vs P沟道MOS管,怎么选才不?一文搞懂选型关键

    ”隐患。很多人选型时只看参数,忽略沟道类型的核心差异,最终返工、调试反复。今天就从原理、场景、选型技巧三方面,帮你彻底理清两者的区别,选对不。 一、先搞懂核心差异:原理层面的本
    的头像 发表于 03-18 08:47 1585次阅读
    N沟道 vs P沟道MOS管,怎么选才不<b class='flag-5'>踩</b><b class='flag-5'>坑</b>?一文搞懂选型关键

    从零开始做嵌入式数字时钟,我的三个大坑

    作为一名刚完成嵌入式数字时钟项目的开发,回顾这段经历,真是一边一边成长。这个项目看似简单——不就是显示个时间吗?实际动手才发现,从“能跑”到“准时报时”,中间隔着好几个不眠之夜。今天就把我真实
    的头像 发表于 03-06 10:49 262次阅读
    从零开始做嵌入式数字时钟,我<b class='flag-5'>踩</b><b class='flag-5'>过</b>的三个大坑

    到高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得

    到高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得 (适合做:选品、比价、代购集运、店铺上货、数据分析、返利工具的同学直接落地) 一、开篇:为什么 90% 的人都会卡在「关键词搜索
    的头像 发表于 02-28 14:22 1599次阅读

    K8s生产环境10大记录复盘

    这篇文章记录了我这些年在 K8s 生产环境。每一个案例都是血泪教训,有些甚至导致了生产事故。希望通过分享这些经历,能帮助大家避免重蹈覆辙。
    的头像 发表于 02-05 15:51 807次阅读

    记ESP32CAM解决指南,已反映商家

    中国香河英茂科工没有一个鸭蛋是白吃的,没有一分钱融资是百花的,都转化为科技成果----记ESP32CAM解决指南,已反映商家 https://user.qzone.qq.com/382905282/blog/1770127464
    发表于 02-03 22:23

    智能工厂改造?有人物联网手把手教你挑对系统

    中小工厂砸几十万搞智能改造,结果了最冤的:花 “智慧工厂系统” 的钱,买的只是个 “升级款工厂监控系统”—— 只能看设备转不转,没法调生产、降能耗,钱直接打了水漂。智能改造选系统,真的像开盲盒
    的头像 发表于 12-19 14:20 490次阅读
    智能工厂改造<b class='flag-5'>踩</b><b class='flag-5'>坑</b>?有人物联网手把手教你挑对系统

    工业电子EMC整改:工业场景下90%工程师的雷区

    工业电子EMC整改:工业场景下90%工程师的雷区|深圳南柯电子
    的头像 发表于 12-16 10:07 521次阅读

    STM32 5 个容易的外设使用技巧

    STM32是嵌入式开发领域的热门MCU,功能丰富到几乎可以完成所有常见控制任务:GPIO、ADC、UART、定时器、DMA……应有尽有。但是,正因为功能强大,开发中的机会也随之增多。很多初学者
    的头像 发表于 11-24 19:04 1057次阅读
    STM32 5 个容易<b class='flag-5'>踩</b><b class='flag-5'>坑</b>的外设使用技巧

    JLink、RV Debugger及串口下载使用体验和

    自己搭配调试器或串口工具来进行,虽然造成了一定麻烦,却也是学习)的好机会。 以下将以调试器为顺序,简单叙述使用感受及过程
    发表于 11-05 12:04

    UWB自动跟随技术原理、算法融合优化和实录

    UWB为什么是最靠谱的自动跟随技术?原理是什么?需要做什么算法融合、优化?我们在开发过程
    的头像 发表于 08-14 17:45 1901次阅读
    UWB自动跟随技术原理、算法融合优化和<b class='flag-5'>踩</b><b class='flag-5'>坑</b>实录