Golang学习之路—基本数据类型

数据类型介绍

每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
数据类型分为两种,一种是基本数据类型,另一种是派生数据类型,见下图。
在这里插入图片描述

整数类型

基本介绍

简单的说,就是用于存放整数值的,比如0,1,-1,12345等等。

整数的类型

类型 有无符号 占用存储空间 范围
int8 1字节 -128-127
int16 2字节 -2^15 - 2^15-1
int32 4字节 -2^31 - 2^31-1
int64 8字节 -2^63 - 2^63-1

int 的无符号类型

类型 有无符号 占用存储空间 范围
uint8 1字节 0 - 255
uint16 2字节 0 - 2^16-1
uint32 4字节 0- 2^32-1
uint64 8字节 0 - 2^64-1

int 的其它类型说明

类型 有无符号 占用存储空间 范围
int 32位系统4个字节,64位系统8字节 -2^31 - 2^31-1, -2^63 - 2^63-1
unit 32位系统4个字节,64位系统8字节 0 - 2^32-1 , 0 - 2^64-1
rune 与int32一样 -2^31 - 2^31-1
byte 与unit8一样 0 - 255

整型的使用细节

  1. Golang各整数类型分:有符号和无符号,int, unit的大小和系统有关。
  2. Golang的整型默认声明为int型。
  3. Golang程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型。
  4. bit:计算机中的最小存储单位,byte:计算机中国基本存储单元。 1byte = 8 bit

小数类型/浮点型

基本介绍

小数类型就是用于存放小数的,比如1.2,6.26等等。

小数类型

类型 占用存储空间 范围
单精度float32 4字节 -3.403E38 - 3.403E38
双精度float64 8字节 =-1.798E308- 1.798E308

说明

  • 关于浮点数在机器中存放形式的简单说明,浮点数 = 符号位 + 指数位 + 尾数位。
  • 浮点数都是有符号的。
  • 尾数部分可能丢失,造成精度损失。
package main
import "fmt"

func main(){
    
    
  var num1 float32 = -100.123456789
  var num2 float64 = -100.123456789

  fmt.Println("num1 =",num1,"num2 = ",num2)

}

在这里插入图片描述

浮点型使用细节

  1. Golang浮点类型有固定的范围和字段长度,不受具体OS的影响
  2. Golang的浮点型默认声明为float64类型
  3. 通常情况下,应该使用float64,因为float64的精度比float32要准确。

字符类型

基本介绍

Golang中没有专门的字符类型,如果要存储单个字符,一般使用byte来保存。
字符串就是一串固定长度的字符连续连起来的字符序列。Go的字符串是由单个字节连接起来的。就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成。

案例

package main
import "fmt"

func main() {
    
    
   
	var c  byte = 'a'
	var c1 byte = '0'
	
	//当我们直接输出byte值,就是输出对应的字符的码值
	fmt.Println("c = ",c,"c1 =",c1)
	
	//如果我们要输出对应的字符,需要使用格式化输出
	fmt.Printf("c=%c c1=%c\n",c,c1)

	//var c2 byte = '字'//overflow 溢出

	var c3 int = '字'
	fmt.Printf("c3=%c c3的码值=%d",c3,c3)

}

输出结果:
在这里插入图片描述
说明

  • 如果我们保存的字符在ASCII表的,比如0到9,a-z等,直接可以保存到byte
  • 如果我们保存的字符对应码值大于255,这是我们可以考虑int类型来保存
  • 如果我们需要按字符的方式输出,这是我们需要格式化输出,即fmt.Printf

字符类型使用细节

  • 字符常量是用单引号‘’括起来的单个字符,例如var c byte = ‘a’,var c1 int = '中’
  • Go中允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如var c char = '\n’表示换行
  • Go语言的字符使用UTF-8编码(英文字母1个字节,汉子3个字节)
  • 在Go中,字符的本质是一个整数,直接输出是,是该字符对应的UTF-8编码的码值
  • 字符类型是可以进行运算的,相当于一个整数,因为它都是Unicode码

布尔类型

基本介绍

  • 布尔累次那个也叫bool类型,bool类型数据值允许取值true和false
  • bool 类型占1个字节
  • bool类型适于逻辑运算,一般用于程序流程控制

案例

package main
import "fmt"
import "unsafe"
func main() {
    
    
   
   var b = false

   fmt.Println("b=",b)
   fmt.Println("b的占用空间 =",unsafe.Sizeof(b))

}

运行结果:
在这里插入图片描述

string类型

基本介绍

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串使用UTF-8编码标识Unicode文本。

案例

package main
import "fmt"
func main() {
    
    
   
  var name string = "Casey"
  fmt.Println(name)
}

运行结果:
在这里插入图片描述

string使用注意事项

  • Go语言的字符串的字节使用UTF-8编码标识,Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题不会再困扰程序员。
  • 字符串一旦复制了,字符串就不能修改了,在Go中字符串是不可以变的。
package main
import "fmt"
func main() {
    
    
   
  var name string = "Casey"
  name[0] = 'c'
  fmt.Println(name)
}

在这里插入图片描述

  • 字符串的两种表示形式,双引号,会识别转移字符,反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击,输出源代码等效果。
  • 字符串拼接方式
func main() {
    
    
   
  var name string = "Casey"
  name += "Casey"
  fmt.Println(name)
}
  • 当一行字符串太长,需要使用多行字符串,可以如下处理。
package main
import "fmt"
func main() {
    
    
  //分行写,将+保留在上一行
  name := "Casey" + "hello world!hello world!hello world!"+
  "hello world!"
  fmt.Println(name)
}

基本数据类型默认值

在go中,数据类型都有一个默认值,当没有赋值时,就会保留默认值,在go中默认值又叫零值。

数据类型 默认值
整型 0
浮点型 0
字符串 “”
布尔类型 false

基本数据类型的相互转换

Golang和java/c不同,Go在不同的变量之间赋值时需要显示转换。也就是说Golang中数据类型不能自动转换。

案例:

package main
import (
	"fmt"
)
func main() {
    
    
  
   var i int32 = 100
   //将i转换成float
   var n1 float32 = float32(i)
   var n2 int8 = int8(i)//高到低
   var n3 int64 = int64(i) //低到高

   fmt.Printf("i = %v,n1 = %v, n2 = %v, n3 = %v\n",i,n1,n2,n3)
}

运行结果:
在这里插入图片描述
注:
在go中,数据类型的转换可以从表示范围小到表示范围大,也可以 范围大到范围小。在转换中国,比如将int64 转成 int8,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。因此在转换时,需要考虑范围。

基本数据类型和string的转换

基本类型转string类型

方式1:fmt.Sprintf("%参数",表达式)
Sprintf根据format参数生成格式化的字符串并返回该字符串。

方式2:使用strconv包的函数

代码:

package main
import (
	"fmt"
	"strconv"
)
func main() {
    
    
   var num1 int = 99
   var num2 float64 = 3.14
   var b bool = true
   var myChar byte = 'h'
   var str string

   //方式1,使用fmt.Sprintf
   str = fmt.Sprintf("%d",num1);
   fmt.Printf("str type %T,str = %q\n",str,str)
   
   str = fmt.Sprintf("%f",num2);
   fmt.Printf("str type %T,str = %q\n",str,str)

   str = fmt.Sprintf("%t",b);
   fmt.Printf("str type %T,str = %q\n",str,str)

   str = fmt.Sprintf("%c",myChar);
   fmt.Printf("str type %T,str = %q\n",str,str)

   //第二种方式 strconv函数

   str = strconv.FormatInt(int64(num1),10)
   fmt.Printf("str type %T,str = %q\n",str,str)
   //说明:'f'格式,10表示小数保留10位,64表示这个小数是float64
   str = strconv.FormatFloat(num2,'f',10,64)
   fmt.Printf("str type %T,str = %q\n",str,str)

   str = strconv.FormatBool(b)
   fmt.Printf("str type %T,str = %q\n",str,str)
}

运行结果:
在这里插入图片描述

string类型转基本数据类型

使用strconv包的函数
案例:

package main
import (
	"fmt"
	"strconv"
)
func main() {
    
    
   var num1 int64
   var num2 float64 
   var b bool 
   var str string = "true"


   //说明:strconv.ParseBool(str)函数会返回两个值(value bool,err error)
   //我们只想获取到value bool,不想获取err,所以用_忽略
   b , _ = strconv.ParseBool(str)
   fmt.Printf("b type %T, b = %v\n",b,b)
   
   var str1 = "123"
   num1 , _ = strconv.ParseInt(str1,10,64)
   fmt.Printf("num1 type %T, num1 = %v\n",num1,num1)

   var str2 = "3.1415"
   num2 , _ = strconv.ParseFloat(str2,64)
   fmt.Printf("num2 type %T, num2 = %v\n",num2,num2)

}

运行结果:
在这里插入图片描述
注:在将string类型转成基本数据类型是,要确保string类型能够转成有效的数据。想要了解更多,可参考go语言中文文档。

猜你喜欢

转载自blog.csdn.net/weixin_44736475/article/details/113866507