golang之数据转换
golang按位取反符号和异或符号都是^。
fmt.Printf("0x%X\n", 0xFF^0x55)
var a uint8 = 0x55
fmt.Printf("%b\n", ^a)
要限定类型或位数,否则按int打印(打印负数)。
数据存储编解码
float32储存为4个字节,int16存储为两个字节,数据大小端怎样存储?
参考:edgexfoundry/device-sdk-go/pkg/commandvalue.go
借助io.Reader,int16和float32限定了数据存储的字节数。
func encodeValue(value interface{}) ([]byte, error) {
buf := new(bytes.Buffer)
err := binary.Write(buf, binary.LittleEndian, value)
return buf.Bytes(), err
}
func decodeValue(reader io.Reader, value interface{}) error {
err := binary.Read(reader, binary.LittleEndian, value)
return err
}
func float32Value(buf []byte) (value float32, err error) {
err = decodeValue(bytes.NewReader(buf), &value)
return value, err
}
func int16Value(buf []byte) (value int16, err error) {
err = decodeValue(bytes.NewReader(buf), &value)
return value, err
}
func uint16Value(buf []byte) (value uint16, err error) {
err = decodeValue(bytes.NewReader(buf), &value)
return value, err
}
func main(){
var ff float32 = 100.5
ffb, err := encodeValue(ff)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(ffb)
}
fmt.Println("------------------")
ffn, err := float32Value(ffb)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(ffn)
}
fmt.Println("----------------------------------")
var us uint16 = 0xFFF1
usb , err := encodeValue(us)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(usb)
}
fmt.Println("------------------")
usn, err := uint16Value(usb)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("0x%X\n", usn)
var mask uint16 = 0x1
var maskv uint16 = 0x0
usn = usn & (^mask) | mask
fmt.Printf("0x%X\n", usn)
usn = usn & (^mask) | maskv
fmt.Printf("0x%X\n", usn)
}
}
float数据精度转换
参考:https://studygolang.com/articles/22284中浮点数比较
golang支持两种浮点float32和float64,众所周知,涉及浮点数比较或运算会遇到精度问题,具体要根据golang实现IEEE 754的情况定。
默认情况下,float32精度是小数后7位,float64精度是小数后15位。浮点数比较时取精度范围内的数据,范围外根据存储情况五舍六入(5实际存储时可能是5.9舍,可能是5.99入)。
package main import (
"fmt"
) func main(){
var a float32 = 1.0000001
var b float32 = 1.00000001
var bb float32 = 1.00000005
var bbb float32 = 1.00000006
var c float32 = 1.00000000000001 fmt.Println(a == b) // false
fmt.Println(a == bb) // false
fmt.Println(b == bb) // true
fmt.Println(b == c) // true
fmt.Println(bb == c)// true
fmt.Println(a == bbb) // true
fmt.Println(bb == bbb) // false
}
小数点后保留两位小数:
func updateFloatPrecision(sf string, pre int, bitSize int) (sfp string, err error){
ff, err := strconv.ParseFloat(sf, bitSize)
if err != nil {
return sf, err
}
sfp = strconv.FormatFloat(float64(ff), 'f', pre, bitSize)
return sfp, nil
}
sfp := "-3.1415926"
sfp, err := updateFloatPrecision(sfp, , )
if err != nil {
fmt.Println(err)
} else {
fmt.Println(sfp)
}
或
sfp, _ :=updateFloatPrecision(sfp, , )
fmt.Prinln(sfp)
因为函数错误时返回原来字符串,成功后返回正确的字符串,符合现实习惯
golang最大数值
math包定义了最大数值。https://golang.google.cn/pkg/math/
Floating-point limit values. Max is the largest finite value representable by the type. SmallestNonzero is the smallest positive, non-zero value representable by the type.
const (
MaxFloat32 = 3.40282346638528859811704183484516925440e+38 // 2**127 * (2**24 - 1) / 2**23
SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23) MaxFloat64 = 1.797693134862315708145274237317043567981e+308 // 2**1023 * (2**53 - 1) / 2**52
SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)
)
Integer limit values.
const (
MaxInt8 = << -
MinInt8 = - <<
MaxInt16 = << -
MinInt16 = - <<
MaxInt32 = << -
MinInt32 = - <<
MaxInt64 = << -
MinInt64 = - <<
MaxUint8 = << -
MaxUint16 = << -
MaxUint32 = << -
MaxUint64 = << -
)
参考:golang最大无符号数
对于不确定位数的uint,最大的无符号数和-1在位数上是一样的。但是,无论是 const MaxUint uint = -1 // Error: negative value , 还是const MaxUint uint = uint(-1) // Error: negative value,都不能通过编译,原因自然是类型与范围的冲突了。但运行时,-1的值确实可以传递给无符号是,怎么通过编译,又将这个值传给无符号数呢?可以
var u uint
var v = -
u = uint(v)
这样就搞定了。另一种方法就是对0取反。区别是,0取反后,是无限多个1,那么有限范围的uint去接它,显然会被编译器认为损失精度了。办法是先构造出确定位数的0,再取反,如下:
const MaxUint = ^uint()
这便是两种获得最大无符号数的方法了。
more
参考:
https://studygolang.com/articles/22284
golang不同类型比较https://studygolang.com/articles/5567
golang最大无符号数
golang之数据转换的更多相关文章
- golang 图片处理,剪切,base64数据转换,文件存储
本文主要介绍: 1. 图片文件的读写. 2. 图片在go缓存中如何与base64互相转换 3. 图片裁剪 本文中,为了方便查看,去掉所有错误判断 base64 -> file ddd, _ := ...
- golang的interface到其他类型的数据转换
以string为例 package main import "fmt" func main() { var a interface{} var b string a = " ...
- golang.org/x/mobile/exp/gl/glutil/glimage.go 源码分析
看这篇之前,建议先看之前几篇,这几篇是基础. Go Mobile 例子 basic 源码分析 http://www.cnblogs.com/ghj1976/p/5183199.html OpenGL ...
- Golang+Mongodb
Golang+Mongodb打造你的第一个站点 很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到 ...
- golang自定义struct字段标签
原文链接: https://sosedoff.com/2016/07/16/golang-struct-tags.html struct是golang中最常使用的变量类型之一,几乎每个地方都有使用,从 ...
- golang json用法讲解
简介 json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好.但是Go语言是个强类型语言,对格式要求极其严格而J ...
- 使用Golang+Mongodb打造你的第一个站点
很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到了js的嵌套回调的话你就会想换换别的办法了.虽然 ...
- golang数据传输格式-序列化与反序列化
golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...
- Golang JSON操作汇总
直接把结构体编码成json数据 package main import ( "encoding/json" "fmt" _ "os" ) t ...
随机推荐
- 浅谈BST(二叉查找树)
目录 BST的性质 BST的建立 BST的检索 BST的插入 BST求前驱/后继 BST的节点删除 复杂度 平衡树 BST的性质 树上每个节点上有个值,这个值叫关键码 每个节点的关键码大于其任意左侧子 ...
- day 18
Only through experience of trial and suffering can the soul be strengthened, vision cleared, ambitio ...
- Vue中的v-bind指令
普通: property="value" 此时 value为字符串 v-bind指令 v-bind:property="value" 此时 value会被解析成 ...
- Python之那些好玩的图画
前言: matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.本文将以例子的形式分析matplot中支持的,分析中常用的几种图.其 ...
- 【转】Web实现前后端分离,前后端解耦
一.前言 ”前后端分离“已经成为互联网项目开发的业界标杆,通过Tomcat+Ngnix(也可以中间有个Node.js),有效地进行解耦.并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构 ...
- Log4j之HelloWorld
在编写项目的时候,我们一般都会用到日志记录,方便出错查找原因.首先我们需要了解什么是Log4j 1.使用maven建立工程,在pom.xml中加入如下: <dependency> < ...
- pytest新版本(5.3.2)中收集测试方法规则不支持以test结尾的方法
pytest新版本(5.3.2)中收集测试方法规则不支持以test结尾的方法,只能命名为以test开头,否则不能识别到
- Error Code: 1175. You are using safe update
使用MySQL执行update的时候报错:Error Code: 1175. You are using safe update mode and you tried to update a tabl ...
- Spring Boot 最流行的 16 条实践解读!
Spring Boot是最流行的用于开发微服务的Java框架.在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践.这些内容是基于我的个人经验和一些熟知的Sp ...
- 天际PRO-CR16 改装方案
本人现有红色CR16一台,宿舍在7楼,最近找了一份长期兼职,不想挤公交,想骑车去,经常上下楼很是痛苦,琢磨了两天两夜,终于出来第一套小该方案,有不合理地方,或者有个好的零件选择,请各位指点.本人不胜感 ...