实数
三个语句效果一样:
days := 365.2425
var days=365.2425
var days float64 = 365.2425 //只要含有小数部分,那么它的类型就是浮点类型float64
浮点类型
float64(双精度):64位、8字节、double(默认)。math操作的都是这种,首选!
float32(单精度):32位、4字节、单精度。应用于处理大量数据
如果数是指数形式,默认是float64
零值
未赋值默认是零
打印
Print、Println:尽可能的多显示几位小数
Printf:格式化输出,
fmt.Printf("%v\n",an) %v:通用格式。%f:浮点。 %.3f:小数后三位。
%T:打印数据类型。
%x:打印十六进制
%4.3f:小数点后三位,总体长度最少4位(包括小数点)不足则左边填充空格,超过不舍弃
%04.3f:小数点后三位,总体长度最少4位(包括小数点)不足则左边填充0,超过不舍弃
%b:打印二进制。 %08b:宽度8位
an:=32
fmt.Print(an+32,"F\n") //64F
%+v:把字段名显示出来
浮点类型精度不准
a:=0.1
a+=0.2
fmt.Println(a==0.3) //false
fmt.Println(math.Abs(a-0.3)<0.0001) //true
go cap和len的区别
首先要搞清楚容量和长度的区别:
容量是指底层数组的大小,长度指可以使用的大小
容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否则,go 会新申请一个底层数组,拷贝这边的值过去,把原来的数组丢掉。也就是说,容量的用途是:在数据拷贝和内存申请的消耗与内存占用之间提供一个权衡。
而长度,则是为了帮助你限制切片可用成员的数量,提供边界查询的。所以用 make 申请好空间后,需要注意不要越界【越 len 】
整数类型
10种类型,取值范围有8种
有符号:int 可能是32位或者64位
无符号:uint可能是32位或者64位
大量数据用int64 uint 64。uint8表示颜色
Int8:-128-127
math.MaxInt16 //只针对于架构无关的
math.MinInt64
整数环绕
var m uint8=255//0-255
m++
fmt.Println(m) //0
十六进制
var b uint8= 0x00
包
time
future:=time.Unix(176362383612.0) //该时间到1970.1.1的秒数
math
b:=math.Trunc(a/10) //若a=18则b=1
os
os.Exit():程序退出
encoding/json
json 包的 Marshal 函数可以将 struct 中的数据转化为 JSON 格式。(例子 21.9)
•Marshal 函数只会对 struct 中被导出的字段(只有大写字母才能被导出)进行编码。
很大数
int64——》uint64--〉--》float64--〉big包
如果数是指数形式,默认是float64
big包
big.Int:较大的整数
a=big.NewInt(2828) //int64-->big,但括号内的数可能超过int64
所以:
a:=new(big.Int)
a.SetString("2828282828288282828",10) //10表示10进制
a.Div(a,b) //a=a/b
等式两边都为big.Int
big.Float:任意精度
big.Rat:分数
较大数值的常量
比较大的数直接使用
const distance= 99 //untyped 无类型
const di uint64 = 99 //uint64
类型间转换
连接两个字符串,使用+运算符号,但+前后类型须一致
整型和浮点型也不能混着用
a:=2
b:=float64(a)
无符号和有符号 不同大小 的整数类型之间需要转换
字符串转换
想把数值转换为string,前提是能转换为code point--》
-
strconv.Itoa(a)
-
Sprintf会返回一个string,相当于转成字符串
-
a, err := strconv.Atoi("10")
if err!= nil{ //nil相当于null,如果为nil相当于没错误
fmt.Println(err.Error())
}
布尔类型的转换
不能使用string(false) int(false) bool(1) bool("tesm")
1和0不是true或false
函数
声明使用func关键字,函数的参数可以多个参数
func Intn(n int) int
调用:1.包名.函数名(实参)
2.同一个包下直接:函数名(实参)
其他包可以调用大些开头的函数、变量或其他标志符
函数的参数如果多个参数类型都一样:func Ab(a,b int64) Time
函数的返回值也可以多个:func Atoi(s string) (i int, err error) 或func Atoi(s string) (int, error)
fmt.Println(a...interface{}) (n int ,err error) : ...表示参数数量可变 a的类型为interface{},为空接口,所有类型都实现这个,所以可以接受任何类型的参数
->fmt.Println(18,"seconds")
方法
type声明新类型
type a float64
var b a=20 //b为float64类型,a为类型别名
不同类型无法混用:var c float64 =10
b+=c //报错
type a float64
type e float64
关联:func (k a) d() e{
} //(k a) :只能有一个接收者,但不能是int float64等预类型, d():方法名,可以加参数或者不加
关联方法的调用:
var f a=20
g=f.d()
一等函数
函数遇到小括号才执行
声明函数类型
•为函数声明类型有助于精简和明确调用者的代码。
•例如:type sensor func() kelvin
•所以:func measureTemperature(samples int, s func() kelvin)
•可以精简为:func measureTemperature(samples int, s sensor)