Golang踩坑记录

本文详细记录了在Golang开发中关于Interface和Json反序列化遇到的陷阱,包括Interface的类型与值指针问题,以及Json反序列化时的精度损失。通过对具体案例的分析,提出了如何避免这些问题的建议,如避免将可能为nil的值赋给Interface,以及使用json.Decoder的UseNumber方法来保留数字精度。
摘要由CSDN通过智能技术生成

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)
}

结果:

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接口所提供的函数即可。

// 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
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangxiaoming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值