[go] binary.Write 小坑一个兼论go的错误处理哲学
2018-01-23 18:16
330 查看
有如下go代码:
输出结果是0,foo没有写入到buffer中。原因在于,binary包的Write内部调用了intDataSize函数获取foo的长度:
而foo的类型是int,intDataSize函数不处理int类型,因此返回0。导致没有数据被写入。
当然,这是我用错了,因为binary包的文档里面写了:
Numbers are translated by reading and writing fixed-size values.
A fixed-size value is either a fixed-size arithmetic
type (bool, int8, uint8, int16, float32, complex64, …)
or an array or struct containing only fixed-size values.
也就是说,使用binary包时,必须使用明确的长度确定的类型,可以用int32,但别用int。
没看清除文档,用错了,怨不得别人。但是binary包把错误直接吞掉的做法,似乎和go的错误处理哲学背离了啊。
intDataSize 函数对于他不能处理的类型,难道不能返回一个error么?或者粗暴些直接给个panic也行啊。这样至少能快速定位错误吧。否则对于不习惯看文档,只是看一下方法的声明就想快速使用的人,这种坑掉进去要爬出来是颇费一些工夫的。
const ( foo = 123 ) buffer := new(bytes.Buffer) binary.Write(buffer, binary.BigEndian, foo) fmt.Println(buffer.Len())
输出结果是0,foo没有写入到buffer中。原因在于,binary包的Write内部调用了intDataSize函数获取foo的长度:
func intDataSize(data interface{}) int { switch data := data.(type) { case bool, int8, uint8, *bool, *int8, *uint8: return 1 case []int8: return len(data) case []uint8: return len(data) case int16, uint16, *int16, *uint16: return 2 case []int16: return 2 * len(data) case []uint16: return 2 * len(data) case int32, uint32, *int32, *uint32: return 4 case []int32: return 4 * len(data) case []uint32: return 4 * len(data) case int64, uint64, *int64, *uint64: return 8 case []int64: return 8 * len(data) case []uint64: return 8 * len(data) } return 0 }
而foo的类型是int,intDataSize函数不处理int类型,因此返回0。导致没有数据被写入。
当然,这是我用错了,因为binary包的文档里面写了:
Numbers are translated by reading and writing fixed-size values.
A fixed-size value is either a fixed-size arithmetic
type (bool, int8, uint8, int16, float32, complex64, …)
or an array or struct containing only fixed-size values.
也就是说,使用binary包时,必须使用明确的长度确定的类型,可以用int32,但别用int。
没看清除文档,用错了,怨不得别人。但是binary包把错误直接吞掉的做法,似乎和go的错误处理哲学背离了啊。
intDataSize 函数对于他不能处理的类型,难道不能返回一个error么?或者粗暴些直接给个panic也行啊。这样至少能快速定位错误吧。否则对于不习惯看文档,只是看一下方法的声明就想快速使用的人,这种坑掉进去要爬出来是颇费一些工夫的。
相关文章推荐
- Go学习笔记(九)接口,错误处理
- Go语言中更优雅的错误处理
- go web: 4 处理默认错误
- L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误
- WLI的一个错误的处理
- 6410_io_drv.c: error: invalid operands to binary << (have 'char *' and 'int') 错误处理
- GO语言标准错误处理机制error用法实例
- Go笔记-错误处理和defer
- 在做Urlwrite+struts2.0的一个小示例的时候老是出现找不到action的情况404错误
- 一个登陆页面,包含了初始化用户,输入检测,错误处理等
- Go圣经-学习笔记之函数和错误处理
- java 异常处理的一个小错误
- LaTeX小技巧——File ended while scanning use of \@writefile错误的处理方法
- 今天早上刚刚碰到的一个问题oracle数据归档已满,只能进行内部连接,ORA-00257 archiver error. 错误的处理方法
- WriteErrorFile() try Except end 错误处理并且保存.txt文件
- android的一个小错误的处理
- linux下write操作原理、错误原因及处理方法
- 一个处理数据库异常的类,按照错误码弹出提示信息
- Spark 1.2.1有关writeAheadLog的官方文档的一个错误