Go 语言 数据类型的介绍

Go 语言 数据类型的介绍

一、整数类型:

1. int 有符号:

类型 有无符号 占用存储空间 表数范围
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

举个栗子:说明超出范围会报错

package main
import "fmt"

func main(){
	var i int8 = 129
	fmt.Println("i=", i)
}

// 报错信息:
# command-line-arguments
.\hello.go:6:15: constant 129 overflows int8

2. int 无符号:

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

举个栗子:超出 int无符号的范围

package main
import "fmt"

func main(){
	var i uint8 = -1
	fmt.Println("i=", i)
}

// 报错信息:
# command-line-arguments
.\hello.go:6:16: constant -1 overflows uint8

3. 其他整数类型:

类型 有无符号 占用存储空间 表数范围 备注
rune 与int32一样 -2^31 ~ 2^31 -1 等价int32,表示一个Unicode码
byte 与uint8一样 0 ~ 255 当要存储字符时选用byte

4. 整数的使用细节:

fmt.Printf():可以用于做格式化输出

  1. go 的整数默认声明为 int 型,举个栗子:
    fmt.Printf("%T"):可以查看类型

    package main
    import "fmt"
    
    func main(){
    	var i = 100
    	// 使用fmt.Printf() 可以用于做格式化输出
    	fmt.Printf("i的类型为:%T", i)
    }
    // 输出结果:i的类型为:int
    
  2. 如何在程序中,查看某个变量的字节大小数据类型,举个栗子:

    unsafe.Sizeof():是unsafe包的一个函数,可以返回变量占用的字节数

    package main
    
    // 推荐方式导包
    import (
    	"fmt"
    	"unsafe"
    )
    
    func main(){
    	var i int64 = 10
    	// 使用fmt.Printf() 可以用于做格式化输出
    	// unsafe.Sizeof(i) 是unsafe包的一个函数, 可以返回i变量占用的字节数
    	fmt.Printf("i的类型为:%T  i占用的字节数是:%d", i, unsafe.Sizeof(i))
    }
    
    // 输出结果:i的类型为:int64  i占用的字节数是:8
    
  3. 在保证程序正常运行情况下,尽量使用占用空间小的数据类型

    func main(){
    	// var age int64  // 不建议使用, 因为年龄不可能有这么大的范围, 占用8个字节
    	var age byte  // 范围在 0 ~ 255   byte 占用 1个字节
    }
    

二、小数类型(浮点型):

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

举个栗子

package main
import (
	"fmt"
)

func main(){
	var price1 float32 = -123.4567890123
	var price2 float64 = -123.4567890123
	fmt.Println("price1:", price1,"price2:",price2)
}

// 输出结果:price1: -123.45679 price2: -123.4567890123

从输出结果可以看出,float64 精确度要比 float32 准确;

如果我们要存储一个精度高的数,尽量使用 float64;

浮点数使用细节:

  1. go 的浮点数默认声明为 float64 类型

    package main
    import (
    	"fmt"
    	"unsafe"
    )
    
    func main(){
    	var price = 6.66
    	fmt.Printf("price默认的数据类型:%T 占用的字节为:%d",price, unsafe.Sizeof(price))
    }
    
    // 输出结果:price默认的数据类型:float64 占用的字节为:8
    
  2. 十进制数形式:

    i := 6.66
    j := .66 // 等于0.66
    fmt.Println("i=", i, "j=", j)
    // 输出结果:i=6.66 j=0.66
    
  3. 科学计数法形式:

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	num1 := 1.2345e2  // 1.2345 * 10的2次方
    	num2 := 1.2345E2 // 1.2345 * 10的2次方
    	num3 := 1.2345E-2  // 1.2345 / 10 * 次方 
    	fmt.Println("num1=", num1, "num2=", num2, "num3=", num3)
    }
    // 输出结果: num1= 123.45 num2= 123.45 num3= 0.012345
    

三、字符类型:

go 中 没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存

go 的字符串,是由单个字节 连接起来的。也就是说,传统的字符串是有字符组成的。

而 go 的字符串不同,它是由字节组成

举个栗子

当我们直接输出byte值, 就是输出了对应的字符的码值(对应ASCII码)

package main
import (
	"fmt"
)

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

// 输出结果如下:
c1= 97
c2= 48
c1=a c2=0

字符的使用细节:

  1. go 语言的字符使用UTF-8

       英文字母 = 1个字节;
       汉字 = 3个 字节;
    
  2. go 字符的本质是一个整数,直接输出时,字符对应的 UTF-8 编码的码值

       package main
       
       import (
       	"fmt"
       )
       
       func main(){
       	var c1 byte = '6'
       	fmt.Println("输出的是UTF-8编码值:", c1)
       }
       
       // 输出结果:输出的是UTF-8编码值: 54
    

    可以对照ASCII码表,找到图形为 ‘6’ ,十进制是54;

  3. 可以直接给某个变量赋值一个数字,然后按格式化输出 %c,输出该数字对应的unicode字符

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	var c1 int = 29275  // 牛 ---> 29275 对应的码值
    	fmt.Printf("输出对应的Unicode %c", c1)
    }
    
    // 输出结果:输出对应的Unicode 牛
    
  4. 查看Unicode对应的码值,格式化输出 %d

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	var c1 int = '牛'
    	fmt.Printf("查看unicode对应的码值:%d", c1)
    }
    // 输出结果:查看unicode对应的码值:29275
    
  5. 字符类型是可以进行运算,相当于一个整数,因为它都有对应的Unicode码

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	var c1 int = 10 + 'a'  // a ---> 97 ASCII码对应的十进制为 97
    	fmt.Println("输出结果:", c1)
    
    }
    
    // 输出结果: 107
    

总结:

  1. 字符型存储到计算中,需要将字符对应的码值(整数)取出来;

    存储过程

    字符 —> 对应码值 —> 二进制 —> 存储

    读取过程

    二进制 —> 对应码值 —> 字符 —> 读取

  2. 字符和码值,对应关系是通过字符编码表决定

  3. go 语言的编码都统一成utf-8。非常方便、统一、解决乱码的问题;

四、布尔类型:

布尔类型也叫bool类型,bool 类型数据仅允许true、false

bool类型,占1个字节

举个栗子

package main
import (
	"fmt"
	"unsafe"
)

func main(){
	var b = false
	fmt.Println("b=", b)
	// 1.bool类型仅占用存储空间1个字节
	fmt.Println("b 占用空间=", unsafe.Sizeof(b))
	// 2.bool 类型仅有true、false
}

// 输出结果如下:
b= false
b 占用空间= 1

注意

不可以用 0 或者 非0 的整数代替 false 、true,这点跟很多语言是不一样的。

五、字符串类型:

字符串就是一串固定长度的字符连接起来的字符序列

go 的字符串是由单个字节连接起来,go 语言的字符串字节使用UTF-8编码标识 Unicode文本

举个栗子

package main
import (
	"fmt"
)

func main(){
	var fe_cow string = "hello world!"
	fmt.Println(fe_cow)
}

// 输出结果:hello world!

字符串类型的使用细节:

  1. 字符串一旦赋值,字符串就不能修改。在go 中 字符串是不可变的

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	var fe_cow string = "hello world!"
    	fe_cow[0] = "c" // 这里就不能去修改fe_cow的内容,在go中字符串是不可变的
    }
    
  2. 双引号,会识别转义字符

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	 fe_cow := "hello\nworld!"
    	 fmt.Println(fe_cow)
    }
    
    // 输出结果如下:
    hello
    world!
    
  3. 反引号,以字符串的原生形式输出,包括换行和特殊字符:

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	 fe_cow := `package main
    	 import (
    		 "fmt"
    	 )
    	 
    	 func main(){
    		  fe_cow := "hello\nworld!"
    		  fmt.Println(fe_cow)
    	 }`
    	 fmt.Println(fe_cow)
    }
    // 输出结果如下:
    package main
             import (
                     "fmt"
             )
    
             func main(){
                      fe_cow := "hello\nworld!"
                      fmt.Println(fe_cow)
             }
    
  4. 字符串的拼接方式:

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	 fe_cow := "hello world!  "
    	 fe_cow += "dog"
    	 fmt.Println(fe_cow)
    }
    // 输出结果:hello world!  dog
    
  5. 字符串太长时,需要使用多行字符串,把 “+” 号放到上面

    package main
    import (
    	"fmt"
    )
    
    func main(){
    	 fe_cow := "hello world! " + "hello world! " + "hello world! " +
    	  "hello world! " + "hello world! " + "hello world! " +  "hello world! "
    	 fmt.Println(fe_cow)
    }
    // 输出结果如下:
    hello world! hello world! hello world! hello world! hello world! hello world! hello world!
    

    错误示例

    // 错误示例:
    package main
    import (
    	"fmt"
    )
    
    func main(){
    	 fe_cow := "hello world! " + "hello world! " + "hello world! "
    	  + "hello world! " + "hello world! " + "hello world! " +  "hello world! "
    	 fmt.Println(fe_cow)
    }
    

    在换行时,一定要把符号赋予上面,然后再进行换行;

发布了147 篇原创文章 · 获赞 170 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Fe_cow/article/details/103801106