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

(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

转自:https://juejin.cn/post/7172921838366900237

最后编辑: kuteng  文档更新时间: 2024-03-27 11:19   作者:kuteng