• go数据类型之基本类型


    基本数据类型

    数值型

    整数

    • int 64位操作系统默认为int64,32位操作系统为int32,但是类型检查时时int
    • int8 (byte 1字节)
    • int16 (short 2字节)
    • int32 (int 4字节)
    • int64 (long 8字节)

    uint uint8 uint16 uint32 uint64 代表无符号int 无符号只能表示正数

    无符号的表示范围更大,因为表示数值得位多1

    int8 -2^(8-1) ~ 2^(8-1) -1

    uint8 0~ 2^8

    整数使用的细节

    根据需求使用int,uint,比如表示人的年龄用uint比int好

    自动推导整数就是int,比如 a:=2 这里a是int,在64位操作系统中就是int64

    保小不保大,在确保程序正确运行情况下,尽量使用占用空间较小的数据类型,比如人的年龄 uint8,0到255足够

    bit是计算机中最小存储单位

    byte是计算机中基本存储单元 1byte=8bit

    查看变量数据类型及占用字节大小

    package main
    
    import (
    	"fmt"
    	"unsafe"
    )
    
    
    func main() {
    	
    	n1 := 12
    	var n2 int64 = 666
    	
    	fmt.Printf("n1 type is %T, 占用字节数:%d 
    ", n1,unsafe.Sizeof(n1))	
    	fmt.Printf("n1 type is %T, 占用字节数:%d 
    ", n2,unsafe.Sizeof(n2))	
    }
    
    // 输出结果
    n1 type is int, 占用字节数:8
    n1 type is int64, 占用字节数:8
    

    浮点数

    • float32 (4字节 float)
    • float64 (8字节 double)

    浮点数都是有符号的,注意没有float,只有float32和float64

    浮点数=符号位+指数位+尾数位

    尾数位可能丢失,造成精度损失

    float64比float32表示的范围更大精度更高

    浮点数使用细节
    • golang的浮点数有固定的范围和字段长度,不受具体os的影响

    • 默认声明为float64

    • 通常使用float64,因为精度高,开发中推荐使用float64

    • 浮点数的科学计数法

      4.223E2 = 4.223* 10的2次方

      E可以用小写e代替

      4.251E-2=4.251*10的-2次方

    字符型

    golang没有专门的char类型,一般用单个byte保存单个字母字符

    1byte=8bit 一般说是8位

    UTF-8编码中:1个英文字符或英文标点占1byte

    1个中文汉字或一个中文标点占3byte

    1byte不能存中文字符,utf8编码中一个汉字需要3字节

    func main() {
    	var c3 byte = '狗'
    	fmt.Println(c3)
    }
    // 编译报错
    # command-line-arguments
    .main.go:12:16: constant 29399 overflows byte
    
    // 字符'狗'unicode码值是29399,byte的范围-128~127,所以overflows byte
    // 想要保存中文字符怎么办? 用更大的数据类型 比如int
    var cc  int = '狗'
    // Println(cc) 输出的是码值 29399 想输出字符需要Printf("%c",cc)
    
    //-----------自动推导
    	c4 := '狗'
    	fmt.Printf("%c,%d byte,type is %T",c4, unsafe.Sizeof(c4), c4)
    // -------------输出结果----
    狗,4 byte,type is int32
    

    字符型使用细节

    1. 如果保存ASCII表中的字符,保存到byte
    2. 如果保存的字符码值overflow byte,可以考虑用int,字符型自动推导类型时就会按码值大小选择int32或int64
    3. 默认输出的是字符对应的码值,想输出字符需要用%c
    4. 允许字符转义,如' '表示一个换行符
    5. golang中的字符本质是一个整数,可以进行运算,如'A'+23

    字符型数据存储和读取过程

    存储:字符 ->查码表 ->获取码值->将码值转二进制 ->保存

    读取:二进制数据 ->转码值 ->查码表 -> 字符

    布尔型

    bool 类型的值只有true 和 false

    bool占用1byte

    bool用于逻辑判断

    与int不兼容 不能转数字类型

    字符串

    其他语言的中:一串固定长度的字符连接起来的字符序列称为字符串,由字符(char)组成

    golang字符串由单个字节连接起来构成的,由字节(byte)组成

    	str := "国际歌"
    	fmt.Println(len(str))  // 长度是9  java/python/js中长度是3
    

    java的字符串是一个char数组,但是golang是没有char的

    string在go中属于基本数据类型

    不可变类型,字符串在各种编程语言中都是不可变的,因为字符使用场景太多,作为函数参数,hash表的key

    等需求要求字符串高效、安全,可hash,所以设计成不可变类型

    字符串两种表示形式

    1. 使用双引号 var name string ="Jack"

    2. 使用反引号

      var Message = `I can not love 
       golang	 any more!`
      // 反引号中的字符串是原始字符串,就像python中的 r" something "
      

    字符串使用细节

    字符串拼接:

    msg :="hello"+"world"

    msg+="!!!!"

    多行字符串拼接时+号必须放在行尾,而不是下一行的行首

    info := "asjdkljflskdf"+"adsfasdf"+
    		"xxxx"
    

    不常用的几种基本类型

    • uintptr 表示一个整数,长度与操作系统有关,可以保存指针地址
    • rune int32的别名 用unicode码值保存
    • complex64 complex128

    基本数据类型的默认值

    定义一个变量,未赋值,这个变量有默认值,这个值也称为零值。

    DATA TYPE DEFAULT VALUE
    int 0
    float 0.0
    string ""
    bool false

    数值型相互转换

    golang中的数据类型转换必须显示转换,没有自动转换

    不像Java中小转大,低精度转高精度能自动转型

    类型转换基本语法:T(v)将变量v强制转换为T类型

    var i int32 = 666
    var f float32 = float32(i)
    

    数据类型转换细节:

    1. golang小转大,大转小,低精度到高精度,高精度转低精度都要强制类型转换
    2. 被转换的是变量中保存的数据值,变量本身的数据类型不变,就像函数中的值传递
    3. 大转小时,比如int64一个比较大的数转int8,不会报错但是也不是希望的结果,会按溢出处理,转换时注意数据类型的取值范围
    4. 两个范围、精度不同的数据在一个表达式中运算时,结果是其中范围大,精度高的一个

    string的类型转换

    方式1:

    fmt.Sprintf("%参数", 表达式) // 字符串格式化
    // %c  char
    // %t  bool
    // %d  十进制整数
    // %f  浮点数
    

    方式2:

    // 使用strconv包的函数
    func FormatBool(b bool) string
    func FormatInt(i int64, base int) string
    func FormatUint()
    func FormatFloat(f float64,fmt byte,prec,bitSize int)string
    
    // 十进制  Atoi s->int  Itoa int->s
    
    
    // 字符串转其他  失败时有默认值
    func ParseBool(str string)(value bool,err error)
    func ParseInt(s string, base int, bitSize int)(i int64,err error )
    func ParseUint()
    func ParseFloat(s string, bitSize int)(f float64,err error)
    
    
  • 相关阅读:
    python+requests+excel 接口测试
    Pycharm配置git
    ubuntu16.04+ROS安装kinectV1
    ubuntu16.04安装有道词典
    ROS kinetic语音识别
    在Ubuntu16.04中python环境下实现tab键补全
    ros kinetic安装rbx1
    ubuntu14.04安装opencv3.1
    ubuntu16.04SSH无法连接
    VC6中函数点go to definition报告the symbol XXX is undefined
  • 原文地址:https://www.cnblogs.com/endurance9/p/10343033.html
Copyright © 2020-2023  润新知