逗号可以去
#go #errors #commaok

您曾经遇到过这样的声明吗?

func main(){
  i:= "hello world"
  n, ok := i.(int)
   if ok {
    fmt.Println("n :", n)
   } else {
    fmt.Println("not an int")
   }
}

好吧,没有尝试捕获块。来自Java/Scala背景,一开始感觉很奇怪,但随后会在您身上成长,然后瞧瞧您像专业人士一样处理错误。

逗号OK是一种错误处理方式。它在4种不同的情况下使用:

  1. 函数返回的错误测试
  2. 测试键值项目是否存在于GO地图中
  3. 测试界面变量是否为某种类型
  4. 测试是否关闭通道

让我们看一个示例

的每个人

1.函数返回时的错误测试

func main() {
 if ok, err := isEven(3); ok {
  fmt.Println("it's an even number")
 }else{
  fmt.Println(err)
 }
}

func isEven(n int)(bool, error){
 if n & 1 == 1{
  return false, fmt.Errorf("it's an odd number")
 }
 return true, nil
}

函数iseven()将整数作为输入,并检查是否是否为输入。 iseven()的返回类型是布尔值和错误。我们将布尔值存储在OK中,并将其用于有条件的语句。

2.测试键值是否存在于GO地图中

func main(){
   var stocks map[string]float64
   sym := "TTWO"
   price := stocks[sym]
   fmt.Printf("1. %s -> $%.2f\n", sym, price)

   if price, ok := stocks[sym]; ok {    // using comma ok to check if key exists
    fmt.Printf("2. %s -> $%.2f\n", sym, price)
   } else {
    fmt.Printf("2. %s not found\n", sym)
   }

   stocks = make(map[string]float64)   // It's importatnt to initialize the map before adding values. Else it's a panic situation
   stocks[sym] = 123.4
   stocks["APPL"] = 345.6

   if price, ok := stocks[sym]; ok {
    fmt.Printf("3. %s -> $%.2f\n", sym, price)
   } else {
    fmt.Printf("3. %s not found\n", sym)
   }
}
OUTPUT:
1. TTWO -> $0.00
2. TTWO not found
3. TTWO -> $123.40

让我们了解代码中发生的事情。

首先,我们声明具有(键,值)类型为(字符串,float)的地图库存。我们尝试获取key = ttwo的值,因为没有与ttwo匹配的键,float的默认值,即返回0.00。

请注意,没有返回的错误。实际上,我们不知道0.00是分配的值还是默认值。

这是Comma OK进行救援的地方。 GO编译器足够聪明,可以理解添加逗号时要返回的内容,因此在线价格中,确定:=股票[sym],确定为false,帮助我们解决困境。

3.测试接口变量是否为某种类型

func main(){
  i := "hello world"
  if n, ok := i.(int); ok{
    fmt.Println("It's an int")
  }else{
    fmt.Println("Not an int")
  }
}

这只是您上面看到的代码的一个稍微修改的版本,以匹配我们所关注的模式。这就是全部ð。
请注意,Go Compiler有多聪明?它知道在哪种情况下使用逗号。

4.测试是否关闭通道

GO频道是一种媒介,goroutine与另一个goroutine通信,此通信是无锁的

func main() {
 ch := make(chan string)    //initializing a channel
 go func() {
  for i := 1; i <= 3; i++ {
   msg := fmt.Sprintf("Current num is #%v", i)
   ch <- msg
  }
  close(ch) //closing the channel lets range know exactly ho much data is there
 }()

 for msg := range ch {
  fmt.Println("received message : ", msg)
 }

 msg := <-ch
 fmt.Printf("Message from a closed channel : %#v\n", msg)

 msg, ok := <-ch  // recieving value through a channel with comma ok
 fmt.Printf("Message : %#v, (was it closed? -> %#v)\n", msg, !ok)
}
OUTPUT : 
received message :  Current num is #1
received message :  Current num is #2
received message :  Current num is #3
Message from a closed channel : ""
Message : "", (was it closed? -> true)

我们创建一个GO例程,该程序将3个整数推入通道CH并在退出例程之前将其关闭。 for循环消耗了通道ch的数据。然后,我们尝试将频道中的下一个消息分配给MSG。由于它是空的,我们将输出作为空字符串。

如果没有什么可消费的话,

通道就不会陷入恐慌状态。他们只是返回默认值。但是您不能将任何值添加到封闭的通道中。它引起了恐慌。

我们真的不知道所消耗的值是实际值还是默认值。这是Comma OK进行救援的地方。