Go语言开发小技巧&易错点100例(〇)

简介: Go语言开发小技巧&易错点100例(〇)

全民制作人们大家好,我是练习时长两年半的个人练习生Barry Yan,喜欢唱、跳、Coding、羽毛球,Music!

今天给大家带来的这一档文章呢,主要是总结一下自己Coding过程中遇到的问题以及平时读一些博客的所得,因为做gopher也有了一段时间了,相比Java,有些问题的出现想要利用搜索引擎排查出来可能不是那么的迅速,所以在这里以文章的形式总结出来也方便各位初出茅庐的gopher们能够顺利的解决所遇到的问题,并能够习得一些小技巧。

为什么叫《Go语言开发小技巧&易错点100例》呢,说实话我也不知道能不能写到100例,只能说作为自己的一个小目标吧,先赚它一个亿,哈哈哈,只有目标才能促使自己不断Coding,不断发现和总结问题,相信到最后肯定要多于100个的,今天就先来4个!

先罗列一下吧(技巧类用【技】表示,易错点用【易】表示)

(1)return返回值屏蔽【技】

(2)context继承【易】

(3)禁止main退出【技】

(4)map遍历次序【易】

正文

1 return返回值屏蔽【技】

返回值屏蔽的概念就是直接return也能返回函数的返回值,但是需要将返回值进行赋值操作,比如我们定义一个函数:func method(parm string) string,返回值为string类型,实现函数时就会要求我们必须要return一个string类型的变量,但是如下的代码示例中直接一个return,并且也能正常执行

func Hello(name string) (str string) {
   str = "Hello World"
   if name != "" {
      return "Hello " + name
   }
   return
}
func main() {
   fmt.Println(Hello(""))
   fmt.Println(Hello("zs"))
}
复制代码

运行结果:

Hello World
Hello zs
复制代码

这就是返回值屏蔽的效果,但是要想实现,就必须也要像定义参数一样去定义返回值,如func method(parm string) res string,就可以直接进行return了。

2 context继承【易】

众所周知,在Go开发中context包是一个很常用并且重要的包,

func Handler(ctx context.Context) {
  fmt.Println(ctx.Value("name"))
  fmt.Println(ctx.Deadline())
}
func Controller(ctx context.Context) {
  fmt.Println(ctx.Value("name"))
  fmt.Println(ctx.Deadline())
  ctx = context.WithValue(ctx, "name", "ls")
  ctx, _ = context.WithTimeout(ctx, time.Second*10)
  Handler(ctx)
}
func main() {
  ctx := context.WithValue(context.Background(), "name", "zs")
  ctx, _ = context.WithTimeout(ctx, time.Second*5)
  Controller(ctx)
}
复制代码

运行结果:

zs
2022-10-15 14:38:46.0456413 +0800 CST m=+5.005663601 true
ls
2022-10-15 14:38:46.0456413 +0800 CST m=+5.005663601 true
复制代码

context的部分规则如下:

  • WithCancel:基于父级 context,创建一个可以取消的新 context。
  • WithDeadline:基于父级 context,创建一个具有截止时间(Deadline)的新 context。
  • WithTimeout:基于父级 context,创建一个具有超时时间(Timeout)的新 context。
  • Background:创建一个空的 context,一般常用于作为根的父级 context。
  • TODO:创建一个空的 context,一般用于未确定时的声明使用。
  • WithValue:基于某个 context 创建并存储对应的上下文信息。

一般会有父级 context 和子级 context 的区别,我们要保证在程序的行为中上下文对于多个 goroutine 同时使用是安全的。并且存在父子级别关系,父级 context 关闭或超时,可以继而影响到子级 context 的程序。

3 禁止main退出【技】

方式一:

func main() {
   defer func() {for {}}()
   // TODO
}
复制代码

方式二:

func main() {
   defer func() { select {} }()
   // TODO
}
复制代码

方式三:

func main() {
   // TODO
   select {}
}
复制代码

4 map遍历次序【易】

Go语言中map的遍历次序是无序的哈

func main() {
   m := make(map[string]string)
   m["A"] = "a"
   m["B"] = "b"
   m["C"] = "c"
   m["D"] = "d"
   m["E"] = "e"
   for i := range m {
      fmt.Println(i)
   }
}
复制代码

运行结果:

C
D
E
A
B


相关文章
|
3天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
16 2
|
4天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
2天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
9 4
|
1天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
11 1
|
2天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
9 2
|
2天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
10 2
|
3天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
6月前
|
网络协议 Linux Go
分享一个go开发的工具-SNMP Server
分享一个go开发的工具-SNMP Server
145 0
|
6月前
|
搜索推荐 Linux Go
分享一个go开发的端口转发工具-port-forward
分享一个go开发的端口转发工具-port-forward
101 0
|
缓存 IDE 数据可视化
Go 日常开发常备第三方库和工具(中)
重点和大家分享下我们日常开发中所使用到的一些第三方库与工具。 这里我主要将这些库分为两类: 业务开发 基础工具开发