golang学习之旅——基本数据类型

102 阅读5分钟

一、基本数据类型

在go语言中,主要有基本数据类型与复合数据类型。主要有以下类型:

基本数据类型:

  • 整型(int)
  • 浮点型(float)
  • 布尔型(bool)
  • 字符串(string)

复合数据类型:

  • 数组
  • 切片
  • 结构体
  • 函数
  • map
  • 通道(channel)
  • 接口

1.整型(int)

整型又可以细分有符号整型与无符号整型,有符号整型为int8、int16、int32、int64,无符号整型有uint8、uint16、uint32、uint64对应的区别如下表:

类型范围占用空间(字节)有无符号
int8(-128 到 127)-2^7 到 2^7-11
int16(-32768 到 32767) -2^15 到 2^15-12
int32(-2147483648 到 2147483647) -2^31到 2^31-14
int64(-9223372036854775808 到 9223372036854775807)-2^63 到 2^63-18
uint8(0-255)0到 2^8-11
uint16(0 到 65535)0到2^16-12
uint32(0 到 4294967295) 0 到 2^32-14
uint64(0 到 18446744073709551615) 0 到 2^64-18

特别说明:

在golang中,可以使用unsafe.Sizeof()函数查看变量在内容中的存储空间大小。

2.浮点型(float)

浮点型可以分为float32与float64,在go语言中浮点型存在精度的问题。如下:

func main() {
	//	声明变量方式
	var num1 = 3.42
	var num2 = 2.2
	// 期待输出1.22,但是输出1.2199999999999998
	fmt.Println(num1 - num2)
}

因此要解决精度的问题,需要引入第三方包进行解决。

github.com/shopspring/…

3.布尔型(bool)

在go语言中,布尔值不能作为用着数值运算,并且没有隐式转换机制,比如所不能将1看着是true,将0看着是false。在其中,如果声明但是没有赋值的话,默认为false。

4.字符串(string)

使用双引号包裹,如果要定义多行字符串,可以使用反引号进行包裹。

字符串中一些常用方法(注意:使用到strings的方法需要引入strings包)

方法介绍
len(str)求长度
+或者fmt.Sprintf()拼接字符串
strings.Split()分割字符
strings.Contains判断是否包含
stings.HasPrefix,stings.HasSuffix前缀/后缀判断
strings.Index(),strings.LastIndex()子串出现的位置
strings.Join(a[]sting,sep sting)join拼接操作

5.字符

在go中,字符使用单引号包裹,字符只能有一位,超过了就是字符串。字符类型主要有两种。

  • uint8:或者叫byte型,代表的是一个ASCII码的值
  • rune:代表一个utf-8字符

案例:循环输出字符串中每个字符的ASCII码值。

func main() {
	//	声明变量方式
	var str1 = "hello,world"
	for i := 0; i < len(str1); i++ {
		// 输出104(h)101(e)108(l)108(l)111(o)44(,)119(w)111(o)114(r)108(l)100(d)
		fmt.Printf("%v(%c)", str1[i], str1[i])
	}
}

注意:如果字符串中有汉字,使用for循环输出的值不正确,需要使用range循环函数。

func main() {
	//	声明变量方式
	var str1 = "你好"
	// 注意前面的_占位符
	for _, v := range str1 {
		fmt.Printf("%v(%c)", v, v)
	}
}

修改字符,golang中不能直接修改字符的值,首先需要将转换为byte或者rune类型

func main() {
	//	声明变量方式
	var str1 = "good golang"
	// 先将str1转为rune类型
	var str2 = []byte(str1)
	str2[0] = 'h' // 注意:这里是字符,要使用单引号
	fmt.Println(str1)
	// 输出”hood golang“
	fmt.Println(string(str2))
}

如果字符串中含有汉字或者要改变的字符是汉字,需要转换为rune类型

func main() {
	//	声明变量方式
	var str1 = "你好"
	// 先将str1转为rune类型
	var str2 = []rune(str1)
	str2[0] = '她' // 注意:这里是字符,要使用单引号
	fmt.Println(str1)
	// 输出”她好“
	fmt.Println(string(str2))
}

6.类型之间进行转换

整型之间与浮点型之间进行转换

func main() {
	//	声明变量方式
	// 整型之间转换直接强制转换即可,推荐将地位往高位进行转换,不然容易造成溢出
	var a int8 = 16
	var b int16 = 130
	fmt.Println(int16(a) + b)

	// 浮点型之间转换与整型之间同理
	var c float32 = 2.34
	var d float64 = 356
	fmt.Println(float64(c) + d)
}

其他类型转换为字符串类型

fmt.Sprintf不仅仅可以用来进行字符串拼接,同样可以将其他类型转换为字符串类型。

func main() {
	//	声明变量方式
	var a int = 12
	//	将a转换为string类型
	var str1 = fmt.Sprintf("%d", a)
	// 输出12-string
	fmt.Printf("%v-%T", str1, str1)
}

使用strconv包把其他类型转换转换为string类型

func main() {
	//	声明变量方式
	var a int = 12
	//	将a转换为string类型
	// 注意:FormatInt()接收两个参数,第一个参数必须是64位,第二个表示是十进制
	var str1 = strconv.FormatInt(int64(a), 10)
	fmt.Printf("%v-%T", str1, str1)
}

同理:与FormatInt()方法类似有FormatFloat(),FormatBool(),FormatUnit()方式,使用方式类似,可以查看源码进行了解。

同样,可以使用strconv将string类型转换为float类型

func main() {
	//	声明变量方式
	var str1 string = "1234.8"
	// 将str1转换为float,注意_占位符,因为ParseFloat()函数会返回两个值,如果转换失败err会有值,一般使用_这种匿名变量进行占位
	// a, err := strconv.ParseFloat(str1, 64)
	// 推荐使用
	a, _ := strconv.ParseFloat(str1, 64)
	fmt.Printf("%.2f-%T", a, a)
}

同理:与ParseFloat()方法类似有ParseInt(),ParseBool(),ParseUnits()方式,使用方式类似,可以查看源码进行了解。