GO基础语法2-基本数据类型 | 青训营笔记

121 阅读5分钟

一、有哪些?

基本数据类型、复杂数据类型、自定义类型

二、基本数据类型

1、数值型

1. 整数类型

存整数值的类型

有哪些?

image.png

image.png

有符号:int8/int16/int32/int64/int(64位电脑下等价int64)/rune rune:本质是int32,可以看做“字符型”,是用来存Unicode字符,比如'华' 占4个字节。为什么?因为Unicode码的单个字符最多占4个字节。

无符号:uint8/uint16/uint32/uint64/uint/byte byte:本质是uint8,可以看做“字符型”,是用来存ASCII字符的。占1个字节。

相比byte,rune能存更多种类的字符。

使用细节:

  • 如何查看一个变量占用的字节大小和数据类型?
    • var n1 int64 = 10
    • fmt.Printf("n1的类型 %T,n1占用的字节数为 %d\n", n1, unsafe.Sizeof(n1))
  • 在使用整型变量时,在保证程序正确运行的情况下,尽量使用占用空间小的数据类型。
    • 比如存年龄,用byte存,因为byte能存0-255的数,而人的年龄很少能达到255。
  • bit是计算机中最小的存储单位,byte是计算机中基本的存储单元。
  • 不同类型的变量不能进行运算。比如int8类型的变量不能和int64类型的变量进行运算。

2. 浮点类型

存小数值的类型。

有哪些?

image.png

float32/float64

浮点数在机器中是如何存放的?

分三部分存储,符号位、指数位、尾数位。

在存储的过程中,尾数部分可能会丢失,造成精度丢失。所以,更推荐使用float64,而不是float32,因为精度更高。

使用细节

  • 浮点类型的范围和字段长度固定,不受具体操作系统的影响。
  • 浮点类型默认声明为float64类型
  • 浮点型常量有两种表示形式
    • 十进制数形式 1.11 .111
    • 科学计数法形式 5.111e2 = 5.11*10^2

2、布尔型

true/false

占1字节,适用于逻辑运算,一般用于流量控制中的条件语句、循环语句。

3、字符串

1)是什么?

  • 传统的字符串:一串固定长度的字符连接起来的字符序列。
  • Go的字符串:字节连接起来的字节序列。是utf-8编码标识Unicode文本。

2)字符串是一个字符数组,可以用下标访问每个字符。

底层指向了一个字节数组。(字符数组用来表示字符串,字节数组用来存储字符串)

3)有哪些形式?

a.用双引号包裹。会识别内部的转义字符。如果想要在双引号里用双引号,就需要进行转义。 a := "he\"l\"lo"

b.用反引号包裹。不会识别内部的转义字符,而是将字符串的原生形式输出(将换行符、特殊字符一起输出)。适合多行内容的输出(内容换行,结果也换行)。优点:可以防止攻击、输出源代码。

image.png

4)底层是怎么实现的?

底层是一个结构体,包含两个字段,指向底层字节数组的指针与字符串长度。

字符串长度字段,是用来保存字符串长度的,方便你直接获取长度信息。

5)字符串操作

a.用len()得到的是字符串的字节长度,而不是字符长度。

例:

var hello = "你好"
fmt.Printf("%d\n", []byte(hello))   // [228 189 160 229 165 189]
fmt.Printf("%d\n", len(hello) // 6

一个汉字占3字节,

b.字符串拼接 字符串之间可以用+号拼接。 字符串只能与字符串拼接。(Java里似乎可以和整型字面量拼接,因为有隐式转换。但go里可没有什么隐式转换)

c.主要方法都在strings包下。

6)注意事项与使用细节

a.字符串定义好后,无法通过访问下标的方式改变其中的字符。因为它底层指向了一个字节数组,数组不可变。

b.很长的字符串可以分行写,记得在结尾留+号。

三、除字符串外,基本数据类型间的类型转换

1、怎么做?

T(v) // T是目标数据类型,v是需要转换的变量

2、使用细节

a.基本数据类型的类型转换,既可以由低精度转为高精度,也可以由高精度转为低精度。

var i int32 = 100
var n1 float32 = float32(i) // 低精度转高精度
var n2 int8 = int8(i) // 高精度转低精度

b.高精度转低精度时,编译器不会报错,只会将转换结果按溢出处理,所以在转换时要考虑范围。

var v1 = 999999
var v2 int8 = int8(v1) // int8的表示范围为-128~127
fmt.Println(v2) // 63

四、基本数据类型和字符串间的类型转换

1、基本数据类型怎么转字符串?

a. fmt.Sprintf("%参数", 表达式) 传入参数,以字符串的形式返回。 要求:参数要与表达式的数据类型相匹配。

b. 使用strconv包的函数 包内提供了字符串和其他基本数据类型间的转换函数。 strconv = string conversion

包里有哪些函数? FormatInt、FormatFloat等等

2、字符串怎么转数值型?

使用strconv包内的函数 ParseFloat、ParseInt等等