【常见错误】go基础语法中容易搞错的语法
创始人
2025-05-30 03:23:26
0

文章目录

    • 一、map初始化容易犯的错
    • 二、结构体空指针
    • 三、使用对循环迭代器变量的引用


github中100-go-mistakes:https://github.com/teivah/100-go-mistakes

一、map初始化容易犯的错

在 Go 语言中,使用 map 前必须进行初始化,否则会报错。常见的 map 初始化错误包括:

  1. 没有使用 make 函数进行初始化

在 Go 语言中,使用 make 函数进行 map 的初始化,例如:

m := make(map[string]int)

如果不使用 make 函数进行初始化,而是使用下面的代码:

m := map[string]int{}

虽然语法上没有错误,但是这样会导致运行时错误,因为 map 没有被正确初始化。

  1. 将 map 作为函数参数传递时,没有进行初始化

当将 map 作为函数的参数传递时,必须在函数中进行初始化,例如:

func foo(m map[string]int) {if m == nil {m = make(map[string]int)}// ...
}
  1. 在使用 map 时没有进行 nil 判断

在使用 map 时,如果 map 没有被正确初始化,会返回 nil。如果没有进行 nil 判断,会导致运行时错误,例如:

二、结构体空指针

在这段代码中,定义了一个名为 Course 的结构体,它具有两个字段:Name 和 Desc,均为字符串类型。接下来,定义了一个 String() 方法来返回 Course 结构体的字符串表示形式。

在 main() 函数中,通过使用 new() 关键字创建了一个名为 c 的指向 Course 结构体的空指针。接着,调用 fmt.Println() 函数来输出 c,这将自动调用 c 的 String() 方法并打印出其字符串表示形式。

由于 c 是一个空指针,其指向的 Course 结构体尚未被初始化,因此 Name 和 Desc 字段都将是空字符串。因此,程序将输出空字符串。具体输出结果取决于实现方式和环境。

package mainimport "fmt"type Course struct {Name stringDesc string
}// 绑定结构体规范
func (c *Course) String() string {return c.Name + c.Desc
}func main() {//结构体的空指针//c := new(Course)c := &Course{}fmt.Println(c.String())
}

三、使用对循环迭代器变量的引用

在这段代码中,定义了一个 goodsID 切片来存储商品的 ID。接着,在 for 循环中使用 range 迭代器来遍历 goodsID,对于每个商品 ID,都创建了一个新的匿名函数并使用 go 关键字来并发地执行它们。

但是,由于匿名函数中的 id 变量是对循环迭代器变量的引用,所以每个匿名函数实际上都在引用相同的 id 变量。在并发执行的过程中,这些匿名函数将共享这个 id 变量,导致输出的结果不是我们期望的。

package mainimport ("fmt""strconv""time"
)// for循环的坑 -> 指针
func main() {//var out []*int//for 循环的临时变量会复用//for i := 0; i < 3; i++ {//	tmp := i//	out = append(out, &tmp)//}//for _, value := range out {//	fmt.Println(*value)//}//假设我又一批商品id,我现在想要拿到这批商品id的详情,并发启动多个goroutine去拿这批商品的详情goodsID := []uint64{1, 2, 3, 4, 5}for _, id := range goodsID {//tmp := id//值传递go func(id uint64) {fmt.Println("正在查询商品:" + strconv.Itoa(int(id)))}(id)}time.Sleep(time.Second * 5)
}

为了解决这个问题,我们可以在循环中创建一个新的变量来存储商品 ID,并将其传递给匿名函数。例如:

for _, id := range goodsID {go func(gID uint64) {fmt.Println("正在查询商品:" + strconv.Itoa(int(gID)))}(id)
}

相关内容

热门资讯

但斌发微博晒基金排名引质疑,律... 红星资本局11月22日消息,今日,深圳东方港湾投资管理股份有限公司(以下简称“东方港湾”)董事长但斌...
湖北知名刑辩律师小区打羽毛球时... 极目新闻记者 王柳钦 11月22日,湖北德来颂律师事务所发布讣告称,湖北德来颂(深圳)律师事务所负责...
潍坊市居家和社区养老服务条例 潍坊市人民代表大会常务委员会公告 (第108号) 《潍坊市居家和社区养老服务条例》已于2025年10...
“欧洲最严格”的移民政策!英国... (央视财经《第一时间》)当地时间20日,英国启动50年来最大移民制度改革。非法移民与依赖社会福利的入...
西安旅游股份有限公司关于子公司... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
土耳其驻华大使坚定重申:一个中... 中国日报网11月21日电(记者 潘一侨 郑朱翎 )近日土耳其驻华大使于纳尔在接受中国日报专访时,就日...
18项税收政策在海南自贸港落地... 中新网海口11月22日电 (记者 王子谦)特殊的税收制度安排是海南自贸港政策制度体系的保障。自海南自...
上海男子醉酒骑车被树枝绊倒致伤... 此前,上海一男子在小区内醉酒骑车,被树枝绊倒致八级伤残,案件近日迎来新进展。11月22日,南都N视频...
对接全球高标准经贸规则 海南自... 中新网海口11月22日电 (记者 王子谦)作为中国对外开放的最高形态,海南自贸港正以制度型开放为核心...
律师起诉徐州东站“便捷换乘”不... 近日,律师殷清利向九派新闻反映,其因高铁中转换乘不便,将徐州东站诉至法庭。7月,徐州铁路运输法院出具...