Go语言学习笔记(1) - Golang 变量的基本使用与基本类型

特别注意 : Go 语言中任何导入的包或者创建的变量如果不使用的话,会报错 ! 所以一旦你导入了某个包或者创建了某个变量就一定要使用, 否则的话会报错, 编译也不会通过

一. 变量的快速入门

Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性

1.1 创建第一个变量

package main

import ("fmt")

func main()  {
	
	// 创建变量的第一种方式
	var a int
	var b int = 10
	
	fmt.Println(a)
	fmt.Println(b)
}
// 结果 
0
10

需要注意的是,Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。这样做的好处就是可以避免像C语言中那样含糊不清的声明形式,例如:int* a, b; 。其中只有 a 是指针而 b 不是。如果你想要这两个变量都是指针,则需要将它们分开书写。而在 Go 中,则可以和轻松地将它们都声明为指针类型:

二. 创建变量的两种方式

2.1 标准格式 : 使用 var 创建

package main

import ("fmt")

func main()  {
	
	// 创建变量的第一种方式
	var a int
	// 创建时赋初始值
	var b int = 10
	// 批量创建
	var (
		a1 int = 12
		a2 string ="aaa"
	)
	// 创建时让编译器自动识别类型
	var a3 = 12

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(a1)
	fmt.Println(a2)
	fmt.Println(a3)

	// 创建变量的第二种方式

}

2.2 简易格式 : 变量名 := 初始值

package main

import ("fmt")

func main()  {
	
	// 创建变量的第二种方式
	c := 1
	// 同时创建多个变量
	d1,d2 := 12,"cc"

	fmt.Println(c)
	fmt.Println(d1)
	fmt.Println(d2)

}

因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。var 形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方

2.3 Go变量使用注意事项

  • 当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil 等。所有的内存在 Go 中都是经过初始化的。
  • 变量的命名规则遵循骆驼命名法,即首个单词小写,每个新单词的首字母大写,例如:numShips 和 startDate
  • 一般使用简易格式创建变量

2.4 + 号的使用

  • 当两边都是数值型时, 做加法运算
  • 当两边是字符串时, 做字符拼接操作

三. 变量的基本类型

3.1 字符类型 string

	// 1.string
	str := "哈哈哈哈哈"
	fmt.Println(str)

就是基本的字符串类型. 注意 : string 是基本类型, 大小默认是 16字节 (不是很确定! ) 在别的语言中 比如 Java中string 并不是一个基本类型, 但是在 GO中 string是基本类型

注意 : 在使用 string 类型的时候, 如果使用 var 定义的时候不赋初值 则默认值是 “” 也就是空字符串

3.2 Bool 类型

这个就是基本的 布尔类型

	//2. bool
	boolearn := true
	fmt.Println(boolearn)

**

3.3 整数类型

(1) 有符号整数 int
**
Go 语言中没有 short ,long 类型 , 取而代之的是 int , int8 int16 , int32 , int64 类型
int 默认与 本机的位数是一样的, 比如我的电脑是 64位的, int 就是 64位也就是 8字节大小的
int8 后面的 8是指 8 位 , 也就是一个字节 大小范围就是 -128 ~ 127 ,其他以此类推

package main

import (
	"fmt"
	"math"
	"unsafe"
)

func main(){

	//3. int 默认与当前主机的位数有关 , 比如我的电脑是 64位的 , 则 int 就是64位的
	var i   int   = math.MaxInt64
	// 1个字节的 整数类型, int8 后面的8是指 8位 
	var i8  int8  = math.MaxInt8
	// 2个字节的 整数类型 16指 16位
	var i16 int16 = math.MaxInt16
	var i32 int32 = math.MaxInt32
	var i64 int64 = math.MaxInt64

	fmt.Println(i)
	fmt.Println(i8)
	fmt.Println(i16)
	fmt.Println(i32)
	fmt.Println(i64)

	fmt.Println("int 类型的字节大小 :", unsafe.Sizeof(i))
}

(2) 无符号整数 uint
**
无符号整数所有的位都作为数值位, 所以没有负数 , 和 有符号整数相比基本类型, 区别是取值范围
比如 uint8 类型的数 取值范围是 0 255 , int8 类型数 取值范围是 -128 ~ 127

package main

import (
	"fmt"
	"math"
)

func main(){

	var ui uint = math.MaxUint64
	var ui8 uint8 = math.MaxUint8
	var ui16 uint16 = math.MaxUint16
	var ui32 uint32 = math.MaxUint32
	var ui64 uint64 = math.MaxUint64

	fmt.Println(ui)
	fmt.Println(ui8)
	fmt.Println(ui16)
	fmt.Println(ui32)
	fmt.Println(ui64)
}

3.4 整数类型注意事项 [重要]

  • Go语言的数值类型分为以下几种:整数、浮点数、复数,其中每一种都包含了不同大小的数值类型,例如有符号整数包含 int8、int16、int32、int64 等,每种数值类型都决定了对应的大小范围和是否支持正负符号。本节我们主要介绍一下整数类型。

  • Go语言同时提供了有符号和无符号的整数类型,其中包括 int8、int16、int32 和 int64 四种大小截然不同的有符号整数类型,分别对应 8、16、32、64 bit(二进制位)大小的有符号整数,与此对应的是 uint8、uint16、uint32 和 uint64 四种无符号整数类型。

  • 此外还有两种整数类型 int 和 uint,它们分别对应特定 CPU 平台的字长(机器字大小),其中 int 表示有符号整数,应用最为广泛,uint 表示无符号整数。实际开发中由于编译器和计算机硬件的不同,int 和 uint 所能表示的整数大小会在 32bit 或 64bit 之间变化。

  • 大多数情况下,我们只需要 int 一种整型即可,它可以用于循环计数器(for 循环中控制循环次数的变量)、数组和切片的索引,以及任何通用目的的整型运算符,通常 int 类型的处理速度也是最快的。

  • 用来表示 Unicode 字符的 rune 类型和 int32 类型是等价的,通常用于表示一个 Unicode 码点。这两个名称可以互换使用。同样,byte 和 uint8 也是等价类型,byte 类型一般用于强调数值是一个原始的数据而不是一个小的整数。

  • 最后,还有一种无符号的整数类型 uintptr,它没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。

  • 尽管在某些特定的运行环境下 int、uint 和 uintptr 的大小可能相等,但是它们依然是不同的类型,比如 int 和 int32,虽然 int 类型的大小也可能是 32 bit,但是在需要把 int 类型当做 int32 类型使用的时候必须显示的对类型进行转换,反之亦然。

  • Go语言中有符号整数采用 2 的补码形式表示,也就是最高 bit 位用来表示符号位,一个 n-bit 的有符号数的取值范围是从 -2****** 到 2********-1。无符号整数的所有 bit 位都用于表示非负数,取值范围是 0 到 2********。例如,int8 类型整数的取值范围是从 -128 到 127,而 uint8 类型整数的取值范围是从 0 到 255。**

3.5 浮点数类型

浮点数类型包括 float32 和 float64 两种类型

package main

import "fmt"

func main(){
	
	// 1. float32 位 精度为 6位
	var f1 float32 = 0.12
	// 浮点数在声明的时候可以省略整数或者小数部分
	// 但是 建议不要这么写, 看着别扭
	var f2 float32 = .12
	var f3 float32 = 1.

	fmt.Println(f1 ," | ", f2 , " | " , f3)

	//2. float64 位 精度位 15位
	var d1 float64 = 12.2

	fmt.Println(d1)

	var f float32 = 16777216 // 1 << 24
	fmt.Println(f == f+1)    // "true"!

	///3. 可以使用科学计数法声明浮点数
	var d2 float64 = 3.1415926e13
	// 4. 可以像 C 语言那样指定 打印多少位 
	fmt.Printf("%.2f" , d2)
	

}

这些浮点数类型的取值范围可以从很微小到很巨大。浮点数取值范围的极限值可以在 math 包中找到:

  • 常量 math.MaxFloat32 表示 float32 能取到的最大数值,大约是 3.4e38;
  • 常量 math.MaxFloat64 表示 float64 能取到的最大数值,大约是 1.8e308;
  • float32 和 float64 能表示的最小值分别为 1.4e-45 和 4.9e-324。

一个 float32 类型的浮点数可以提供大约 6 个十进制数的精度,而 float64 则可以提供约 15 个十进制数的精度,通常应该优先使用 float64 类型,因为 float32 类型的累计计算误差很容易扩散,并且 float32 能精确表示的正整数并不是很大。

var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1)    // "true"!


ads

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章