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

    文章

    4317

    浏览量

    62487
  • go语言
    +关注

    关注

    1

    文章

    158

    浏览量

    9033

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    go语言如何解决并发问题

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

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

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

    仓颉语言书籍申请

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

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

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

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

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

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

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

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

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

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

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

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

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

    ”经验分享:Swift语言落地实践

    Swift认为字符串是由一个个字形群集 (grapheme clusters)组成的,字形群集的大小不固定所以不能用整数去索引 (字形群集其实就是Swift中的Character(字符)类)。
    的头像 发表于 12-28 17:37 821次阅读

    使用go语言实现一个grpc拦截器

    在开发grpc服务时,我们经常会遇到一些通用的需求,比如:日志、链路追踪、鉴权等。这些需求可以通过grpc拦截器来实现。本文使用go语言来实现一个 grpc一元模式(Unary)拦截器,上报链路追踪信息。
    的头像 发表于 12-18 10:13 642次阅读
    使用<b class='flag-5'>go</b><b class='flag-5'>语言</b>实现一个grpc拦截器

    嵌入式工程师C语言小技巧

    软件界看起来不怎么高大上,但是 MCU 的开发目前 C 语言还是主流,为了更好的操控和调试我们的硬件,我们还是需要竭力的避免一些 C语言编程的陷阱,避免被一些高大上的变成语言或者架构干扰产品整体的进度和可靠性。 第1
    的头像 发表于 12-13 11:32 490次阅读

    Go编程语言-你应该知道的一切

    Go 编程语言的故事始于 Google,当时三位工程师 Robert Griesemer、Rob Pike 和 Ken Thompson 对 C++ 的复杂性以及缺乏提供高效编译和执行的简单语言感到厌倦。
    的头像 发表于 12-11 17:37 628次阅读

    反相输入放大器的,你没有?

    反相输入放大器的,你没有?
    的头像 发表于 12-06 15:35 603次阅读
    反相输入放大器的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b><b class='flag-5'>过</b>没有?