您曾经遇到过这样的声明吗?
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种不同的情况下使用:
- 函数返回的错误测试
- 测试键值项目是否存在于GO地图中
- 测试界面变量是否为某种类型
- 测试是否关闭通道
让我们看一个示例
的每个人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进行救援的地方。