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 ...
随机推荐
- Linux中fork()函数详解(转载)
linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...
- QAbstractItemModel详细剖析 …&&... QAbstractTableModel
从函数开始: QModelIndex QAbstractTableModel::sibling(int row, int column, QModelIndex &idx) const; ...
- 每日一问:简述 View 的绘制流程
Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追 ...
- 【原】无脑操作:Markdown可以这样玩
一.背景: Markdown是一种纯文本格式的标记语言.通过简单的标记语法,可以使普通文本内容具有一定的格式.因为语法简单明了.功能又比纯文本强大,所以很适合作为开发人员的书写工具.Markdown的 ...
- 爬取'Content-Type': 'text/plain;charset=UTF-8' ,发送请求数据方式
解决方式 直接以字符串的方式发送data就可以得到响应数据 import requests data = 'k1:v1,k2:v2' requests.post(url, data=data)
- history 用法大全
history 命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件. 语法 history [options] [file] ...
- 给电脑提升权限---- 切换为administrator
在装系统的时候我们都会在安装的时候进行创建用户这一操作,安装软件的时候总会出现权限不足的情况, 个人建议:如果你要是比较会使用电脑的话,可以体验一下超级管理员这一角色, 就是安装好了之后,切换为超级管 ...
- linux 重启jmeter服务
#!/bin/bash #jmeter kill and start echo -e '\033[32m--------Jmeter---------------\033[0m' echo " ...
- python实现Huffman编码
一.问题 利用二叉树的结构对Huffman树进行编码,实现最短编码 二.解决 # 构建节点类 class TreeNode: def __init__(self, data): "" ...
- 使用IDEA创建maven父子工程项目
http://www.pianshen.com/article/3070289153/ 第一步: 打开IDEA,点击create new project,如果没有弹出如下界面,就先将打开的项目关闭,然 ...