1. golang按位取反符号和异或符号都是^。

fmt.Printf("0x%X\n", 0xFF^0x55)
var a uint8 = 0x55
fmt.Printf("%b\n", ^a)

要限定类型或位数,否则按int打印(打印负数)。

  1. 数据存储编解码

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)
}
}
  1. 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)
因为函数错误时返回原来字符串,成功后返回正确的字符串,符合现实习惯
  1. 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()

这便是两种获得最大无符号数的方法了。

  1. more

参考:

    1. https://studygolang.com/articles/22284
      golang不同类型比较

    2. https://studygolang.com/articles/5567
      golang最大无符号数

golang之数据转换的更多相关文章

  1. golang 图片处理,剪切,base64数据转换,文件存储

    本文主要介绍: 1. 图片文件的读写. 2. 图片在go缓存中如何与base64互相转换 3. 图片裁剪 本文中,为了方便查看,去掉所有错误判断 base64 -> file ddd, _ := ...

  2. golang的interface到其他类型的数据转换

    以string为例 package main import "fmt" func main() { var a interface{} var b string a = " ...

  3. golang.org/x/mobile/exp/gl/glutil/glimage.go 源码分析

    看这篇之前,建议先看之前几篇,这几篇是基础. Go Mobile 例子 basic 源码分析 http://www.cnblogs.com/ghj1976/p/5183199.html OpenGL ...

  4. Golang+Mongodb

    Golang+Mongodb打造你的第一个站点 很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到 ...

  5. golang自定义struct字段标签

    原文链接: https://sosedoff.com/2016/07/16/golang-struct-tags.html struct是golang中最常使用的变量类型之一,几乎每个地方都有使用,从 ...

  6. golang json用法讲解

    简介 json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好.但是Go语言是个强类型语言,对格式要求极其严格而J ...

  7. 使用Golang+Mongodb打造你的第一个站点

    很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到了js的嵌套回调的话你就会想换换别的办法了.虽然 ...

  8. golang数据传输格式-序列化与反序列化

    golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...

  9. Golang JSON操作汇总

    直接把结构体编码成json数据 package main import ( "encoding/json" "fmt" _ "os" ) t ...

随机推荐

  1. centos 升级openSSH7.81

    1.下载相关依赖包 [root@Log ~]# yum install -y gcc openssl-devel pam-devel rpm-build 2.下载安装包 wget http://ftp ...

  2. elasticsearch 官方监控文档 老版但很有用

    https://zhaoyanblog.com/page/1?s=elasticsearch 监控每个节点(jvm部分) 操作系统和进程部分 操作系统和进程部分的含义是很清楚的,这里不会描述的很详细. ...

  3. 【Kubernetes学习之一】Kubernetes 简介

    环境 centos 7 一.概念和组件Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理,简称k8s. 1.Master Kubernetes中的 ...

  4. 使用vue搭建应用五引入Mock.js

    为了模拟后台接口提供页面所需的数据,引入Mock.js Mock.js是一个模拟数据生成器,可帮助前端开发和原型与后端进度分开 特性: 前后端分离 增加单元测试的真实性 数据类型丰富 方便扩展 1.安 ...

  5. 阉割的List

    实在忍不住,模仿STL写了个阉割版的List,还没加迭代器,等搞完STL源码再说吧. #pragma once #include <stdexcept> namespace vlyf { ...

  6. 菜刀连接一句话木马出现:`Cannot call assert() with string argument dynamically`错误

    前言 逆天还是上学那会玩渗透的,后来工作后就再也没碰了,所以用的工具还是以前经典款,这不,发现出问题了 问题 如果是PHP5则没有问题,如果是PHP7,会出现:Cannot call assert() ...

  7. zabbix4.0 本地安装详解及步骤

    安装前说明下,下面安装过程中涉及selinux部分仅供参考,可能会导致启动服务时产生各种报错,作者也是在折腾了无数日夜后报错不断而放弃治疗,直接永久关闭了selinux(啊,没有selinux的日子真 ...

  8. 重温拉格朗日乘子法和KKT条件

    在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...

  9. pands模块的妙用爬取网页中的表格

    拿我这篇为例https://www.cnblogs.com/pythonywy/p/11574340.html import pandas as pd df = pd.read_html('https ...

  10. opencv简单卷积运用

    import cv2 as cv import numpy as np img=cv.imread('learn.jpg',cv.IMREAD_GRAYSCALE) cv.imshow('first ...