Golang踩坑记录-1
系统幂等校验
平时 Golang 开发中会遇到的“坑点”,总结一下,避免重复踩坑
Interface
看代码,答问题
func main() {
var i interface{}
fmt.Println(i == nil)
}
结果:
true
再看如下代码:
func main() {
var p map[string]string
var i interface{} = p
fmt.Println(i == nil)
}
结果:文章来源:https://www.toymoban.com/news/detail-544668.html
false
package main
import (
"code.byted.org/live/utils/errors"
"fmt"
)
func Test() *errors.LiveError {
// ...
// if xxx {
return nil
// }
//...
}
func main() {
var err error
err = Test()
if err != nil {
//
fmt.Println("err is not nil")
}
}
分析
在Go语言中,一个interface{}
类型的变量包含两个指针,一个指向其类型,另一个指向真正的值。只有当类型和值都是nil的时候,才等于nil。
当我们将一个具体类型的值赋值给一个interface类型的变量的时候,就同时把类型和值都赋值给了interface里的两个指针。如果这个具体类型的值是nil的话,interface变量依然会存储对应的类型指针和值指针。这个时候拿这个interface变量去和nil常量进行比较的话就会返回false。
实战的踩坑
网上的实战例子,详细参考及详解 https://studygolang.com/articles/10635
这是我们在GoWorld分布式游戏服务器的开发中,碰到的一个实际的bug。由于GoWorld支持多种不同的数据库(包括MongoDB,Redis等)来保存服务端对象,因此GoWorld在上层提供了一个统一的对象存储接口定义,而不同的对象数据库实现只需要实现EntityStorage接口所提供的函数即可。文章来源地址https://www.toymoban.com/news/detail-544668.html
// EntityStorage defines the interface of entity storage backendstype
EntityStorage interface {
List(typeName string) ([]common.EntityID, error)
Write(typeName string, entityID common.EntityID, data interface{}) error
到了这里,关于Golang踩坑记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!