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

    文章

    4333

    浏览量

    62705
  • go语言
    +关注

    关注

    1

    文章

    158

    浏览量

    9051

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

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

收藏 人收藏

    评论

    相关推荐

    自然语言处理与机器学习的关系 自然语言处理的基本概念及步骤

    自然语言处理(Natural Language Processing,简称NLP)是人工智能和语言学领域的一个分支,它致力于研究如何让计算机能够理解、解释和生成人类语言。机器学习(Ma
    的头像 发表于 12-05 15:21 515次阅读

    ADC高速采样电路设计详解之STM32

    一、过程 最近用STM32F334做数字电源,用到了高速ADC采集电压电流。设计的参考电压VREF为3.3V,输入信号经运放跟随后直接接入单片机的采样通道。一开始测试一切正常,但随着输入信号
    的头像 发表于 12-02 09:27 828次阅读
    ADC高速采样电路设计详解之STM32<b class='flag-5'>踩</b><b class='flag-5'>坑</b>

    go语言如何解决并发问题

    作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比
    的头像 发表于 10-23 13:38 143次阅读
    <b class='flag-5'>go</b><b class='flag-5'>语言</b>如何解决并发问题

    三十分钟入门基础Go Java小子版

    语法与 C 相近,但功能上有:内存安全,GC,结构形态及 CSP-style 并发计算。 适用范围 本篇文章适用于学习其他面向对象语言(Java、Php),但没有学过Go
    的头像 发表于 08-12 14:32 747次阅读
    三十分钟入门基础<b class='flag-5'>Go</b> Java小子版

    仓颉语言书籍申请

    有接触其它的语言,主要是python,python用于机器学习,数据分析是能满足使用,但是用于开发其他的东西就不能满足了,我现在想学习另外一种语言
    发表于 08-06 08:37

    【《大语言模型应用指南》阅读体验】+ 基础知识学习

    今天来学习语言模型在自然语言理解方面的原理以及问答回复实现。 主要是基于深度学习和自然语言处理技术。 大
    发表于 08-02 11:03

    【《大语言模型应用指南》阅读体验】+ 俯瞰全书

    的机会! 本人曾经也参与语音识别产品的开发,包括在线和离线识别,但仅是应用语言模型实现端侧的应用开发,相当于调用模型的接口函数,实际对模型的设计、训练和运行机理并不了解,我想通过学习《大语言
    发表于 07-21 13:35

    按照这样学习C语言,成为卷王不是梦!

    一些学习C语言的建议,让你在学习之路上更加游刃有余,成为C语言的高手。按照这样学习C语言,成为卷
    的头像 发表于 07-06 08:04 328次阅读
    按照这样<b class='flag-5'>学习</b>C<b class='flag-5'>语言</b>,成为卷王不是梦!

    M16连接器12芯采购如何避免

      德索工程师说道在M16连接器12芯的采购过程中,为了避免,确保采购的顺利进行以及产品的高质量,我们可以从以下几个方面进行考虑和规划:
    的头像 发表于 06-07 17:46 814次阅读
    M16连接器12芯采购如何避免<b class='flag-5'>踩</b><b class='flag-5'>坑</b>

    语言模型:原理与工程时间+小白初识大语言模型

    开拓深度学习的思路。对于新涌现的大语言模型的能力,主要是表现在学习能力的提升、语言理解和生成能力、创新和探索的能力。 基础技术 词表示技术 词表示一般分为三种,主要是词的独热表示(On
    发表于 05-12 23:57

    家庭路由器如何选?实用技巧让你不再

    家庭路由器选购需考虑需求、预算、性能指标、硬件配置、软件功能、认证与测试及售后服务。明确需求,选择适合的型号和品牌,确保网络稳定、高速。遵循这些技巧,避免,享受网络便利。
    的头像 发表于 04-29 11:38 679次阅读

    关于go中接口类型的表示方法

    go是一个静态性语言,每个变量都有静态的类型,因此每个变量在编译阶段中有明确的变量类型,比如像:int、float32、MyType。
    的头像 发表于 04-28 10:13 377次阅读

    痛苦“电池电压侦测电路”,含泪总结设计要点

    和大家分享这个电路的设计要点,以及当时的设计失误,帮助大家积累经验,以后不要这种。 设计要点一:设定分压电阻的大小 这种便携式掌上阅读器,当然是内置锂电池的:
    的头像 发表于 04-07 14:31 3501次阅读
    痛苦<b class='flag-5'>踩</b><b class='flag-5'>坑</b>“电池电压侦测电路”,含泪总结设计要点

    学习笔记|如何用Go程序采集温湿度传感器数据

    在共创社内部的交流中,先前有一位成员展示了如何借助C语言来实现对AHT20温湿度传感器数据的读取。这一实例触发了另一位共创官的灵感,他决定采纳Go语言重新构建这一数据采集流程。接下来,我们将详细解析
    的头像 发表于 03-21 11:46 735次阅读
    <b class='flag-5'>学习</b>笔记|如何用<b class='flag-5'>Go</b>程序采集温湿度传感器数据

    高低温试验箱选购指南—防秘籍

    选购高低温试验箱需要综合考虑多方面因素。通过明确需求、选择知名品牌、对比性能指标、权衡价格与性价比、保障售后服务以及参考用户评价与案例等步骤,可以帮助您避免风险,选购到一款性价比高、适合自己需求的高低温试验箱。
    的头像 发表于 02-24 09:22 594次阅读
    高低温试验箱选购指南—防<b class='flag-5'>踩</b><b class='flag-5'>坑</b>秘籍