Featured image of post golang学习五:常用数学函数与数组

golang学习五:常用数学函数与数组

常用数学函数

  • math包提供了基本数学常数和数学函数
  • math包提供的数学常数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Mathematical constants.
const (
	E   = 2.71828182845904523536028747135266249775724709369995957496696763 
	Pi  = 3.14159265358979323846264338327950288419716939937510582097494459 
	Phi = 1.61803398874989484820458683436563811772030917980576286213544862 
	Sqrt2   = 1.41421356237309504880168872420969807856967187537694807317667974
	SqrtE   = 1.64872127070012814684865078781416357165377610071014801157507931 
	SqrtPi  = 1.77245385090551602729816748334114518279754945612238712821380779 
	SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038 
	Ln2    = 0.693147180559945309417232121458176568075500134360255254120680009 
	Log2E  = 1 / Ln2
	Ln10   = 2.30258509299404568401799145468436420760110148862877297603332790 
	Log10E = 1 / Ln10
)

// 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   = 1<<7 - 1
	MinInt8   = -1 << 7
	MaxInt16  = 1<<15 - 1
	MinInt16  = -1 << 15
	MaxInt32  = 1<<31 - 1
	MinInt32  = -1 << 31
	MaxInt64  = 1<<63 - 1
	MinInt64  = -1 << 63
	MaxUint8  = 1<<8 - 1
	MaxUint16 = 1<<16 - 1
	MaxUint32 = 1<<32 - 1
	MaxUint64 = 1<<64 - 1
)
  • 列举出常用的数学函数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
	var i, j float64 = 12.3, 9.6
	//向下取整,
	fmt.Println(math.Floor(i)) //输出:12
	//向上取整
	fmt.Println(math.Ceil(i)) //输出:13
	//绝对值
	fmt.Println(math.Abs(i)) //输出:12.3
	//返回值分别整数位和小数位,小数位可能出现误差
	num, decimal := math.Modf(i)
	fmt.Println(num, decimal)
	//返回两个变量中大的值
	fmt.Println(math.Max(i, j)) //输出:12.3
	//返回两个变量中小的值
	fmt.Println(math.Min(i, j)) //输出:9.6
	//x的y次方
	fmt.Println(math.Pow(3, 2)) //输出:输出9
	//四舍五入
	fmt.Println(math.Round(i)) //输出:12

随机数

  • math/rand实现了伪随机数生成器
  • 在Go语言中随机数需要设置种子,如果不设置种子随机数的结果每次运行都相同。
  • 默认种子是1,且相同种子产生的随机数是相同的.
  • 可以使用当前时间的纳秒差计算随机数,在一定程度上保证了种子的唯一性
1
2
	rand.Seed(time.Now().UnixNano())
	fmt.Println(rand.Int63n(10))

数组

数组介绍

  • 数组:具有固定长度相同类型元素序列
  • 声明数组的语法
1
2
3
	//var 对象名 [长度]元素类型
	var arr [5]int
	fmt.Println(arr) //输出:[0 0 0 0 0]
  • 数组就是内存中一段固定长度的连续空间.
  • 声明数组后数组就会在内存中开辟一块连续空间,每个值称为数组的元素,且元素值为类型对应的默认值.例如int类型默认值为0,string类型默认值为空字符串
  • 数组中每个元素按照顺序都有自己整数类型的脚标,脚标从第一个元素为0向后依次加1
  • 数组中实际开发中主要作用是充当临时容器,因为声明一个数组变量比声明多个相同类型变量在操作时更加方便

数组的创建和赋值

  • 可以在声明数组时可以同时给数组赋值,赋值时要求长度必须大于等于初始值个数
1
2
3
4
5
6
7
8
	//方式一:完整写法
	var arr [3]int = [3]int{1, 2, 3}
	//方式二:短变量方式
	arr2 := [3]int{1, 2, 3}
	//方式三:长度大于初始值个数.长度为4,只给前三个元素赋值,其余元素为默认值
	arr3 := [4]int{1, 2, 3}
	//方式四:赋值时不写长度,数组长度根据元素个数确定
	arr4 := [...]int{1, 2, 3}
  • 可以通过:**数组名[脚标]**对数组中元素进行操作
1
2
3
4
5
6
7
8
	arr := [3]int{1, 2, 3}

	fmt.Println(arr)
	//通过脚标对数组中元素进行重新赋值
	arr[0] = 5
	arr[1] = 6
	arr[2] = 7
	fmt.Println(arr[0], arr[1], arr[2])
  • 通过len(数组变量)获取数组长度,数组脚标最大值为长度减一,如果超出这个范围将会报错
1
2
3
	arr := [3]int{1, 2, 3}
	fmt.Println(len(arr))//输出:3
	arr[3]=5//错误信息:invalid array index 3 (out of bounds for 3-element array)

数组是值类型

  • 在Go语言中数组是值类型,和之前学习的int或float64等类型相同,把一个数组变量赋值给另一个数组变量时为复制副本,重新开辟一块空间
  • 使用==比较数组中值是否相等
1
2
3
4
5
	arr := [3]int{1, 2, 3}
	arr2:=arr
	fmt.Println(arr,arr2)
	fmt.Printf("%p %p",&arr,&arr2)//地址不同
	fmt.Println(arr==arr2)

二维数组

  • 二维数组表示一个数组变量中每个元素又是一个数组变量
  • 声明二维数组的语法
1
var arr [n][m]int
  • 使用 arr[n]时返回一个 arr[m]类型的数组
  • 图示 二维数组

二维数组的使用

  • 声明并创建二维数组
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
	//写在同一行,最后一个元素后面不需要有逗号
	//arr6:=[3][3]int{{1,2,3},{4,5,6},{7,8,9}}
	arr := [3][3]int{
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9}, //每个元素分行写,最后一个必须有逗号
	}
	arr0 := arr[0]
	fmt.Println(arr0[0], arr0[1], arr[2])
	//上面等效于下面的写法.习惯上多下下面的方式
	fmt.Println(arr[0][0], arr[0][1], arr[0][2])

多维数组

  • 理论上支持无限多维数组(只要内存够用)
  • 三维数组可以理解成,一维数组中每个元素都是二维数组.四维数组理解成,一个一维数组中每个元素都是三维数组
  • 无论是几维数组,都符号元素类型是相同的
  • 实际开发中多维数组使用并不多,在一定程度上,程序员使用多维数组很容易出错
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	arr := [2][2][2]int{
		{
			{1, 2},
			{3, 4},
		},
		{
			{5, 6},
			{7, 8},
		},
	}
	fmt.Println(arr)
	//几维数组在操作元素时,数组变量后面就有几个[]
	fmt.Println(arr[0][1][1])

golang学习一:从环境配置开始到HelloWorld入门 golang学习二:golang自带的工具 olang学习三:golang基础语法 golang学习四:流程控制 golang学习五:常用数学函数与数组 golang学习六:for循环 golang学习七:goto和label golang学习八:切片 golang学习九:sort包、map、双向链表、双向循环链表 golang学习十:函数 golang学习十一:包的访问权限、变量作用域、闭包 golang学习十二:值传递和引用传递 golang学习十三:结构体 golang学习十四:golang中的面向对象 golang学习十五:错误异常处理 golang学习十六:文件操作 golang学习十七:反射 golang学习十八:XML操作 golang学习十九:日志 golang学习二十:golang并发编程入门 golang学习二十一:select和GC

Licensed under CC BY-NC-SA 4.0