分享最近学到的 5 个 Golang 小技巧

以下是我最近在 Go 中学到的 5 个小技巧,感觉挺有用且容易被大家忽略,在这里分享给大家。

计算数组元素的活可以交给编译器

在 Go 中,数组的使用并不多,大家都会选择使用 slice。在使用 slice 时,如果不想自己写数组中元素的个数,可以使用 […] ,编译器会帮你计数:

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
arr := [3]int{1, 2, 3}
sameArr := [...]int{1, 2, 3} // Use ... instead of 3

// Arrays are equivalent
fmt.Println(arr)
fmt.Println(sameArr)
}

使用 go run .代替 go run main.go

每当我开始用 Go 创建项目时,我都会先创建一个 main.go 文件:

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

func main() {
sayHello()
}

func sayHello() {
fmt.Println("Hello!")
}

但当 main.go 文件变大时,就要使用同一个 main 将结构体分割到多个文件。但是,如果我有以下文件:

main.go

1
2
3
4
5
package main

func main() {
sayHello()
}

say_hello.go

1
2
3
4
5
6
7
package main

import "fmt"

func sayHello() {
fmt.Println("Hello!")
}

输入 go run main.go 会出现以下错误:

1
2
# command-line-arguments
./main.go:4:2: undefined: sayHello

解决这个问题,需要使用 go run .

使用下划线使数字清晰易读

1
2
3
4
5
6
7
8
9
10
package main

import "fmt"

func main() {
number := 10000000
better := 10_000_000

fmt.Println(number == better)
}

在同一个包中使用不同的 test package

之前以为每个文件夹只能有一个 go package。后来发现对于名为 yourpackage 的包,你可以在同一目录下拥有另一个名为 yourpackage_test 的包,并在其中编写测试。
为什么要这么做呢?因为这样可以使用相同的包 yourpackage 来编写测试,所以未导出的函数也会可用。通过在 yourpackage_test 中编写测试,可以确保只测试暴露的行为。

多次传递相同参数

在使用字符串格式化函数时,总觉得必须重复使用多次的参数是很繁琐的事情:

1
2
3
4
5
6
7
8
package main

import "fmt"

func main() {
name := "Bob"
fmt.Printf("My name is %s. Yes, you heard that right: %s\n", name, name)
}

还有一种更方便的方法。可以只传递一次参数,并在 %s 动词中使用 %[order]s:

1
2
3
4
5
6
7
8
package main

import "fmt"

func main() {
name := "Bob"
fmt.Printf("My name is %[1]s. Yes, you heard that right: %[1]s\n", name)
}

希望大家今天能学到一些新东西。如果你也有一些 golang 小技巧,可以在评论区留言分享!


-------------The End-------------

本文标题:分享最近学到的 5 个 Golang 小技巧

文章作者:cloud sjhan

发布时间:2024年06月12日 - 11:06

最后更新:2024年06月12日 - 11:06

原始链接:https://cloudsjhan.github.io/2024/06/12/分享最近学到的-5-个-Golang-小技巧/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

cloud sjhan wechat
subscribe to my blog by scanning my public wechat account
坚持原创技术分享,您的支持将鼓励我继续创作!
0%
;