前言
摸鱼摆烂半年后,康复训练的第一篇博客,仅以此记录我开启Golang学习的新篇章。
入门第一站环境配置
我们来到官网:The Go Programming Language
我们直接dowload,我们这里注意要记录我们下载的位置

我们把它配置到我们的环境变量中,加入到PATH里
本人采用的编辑器为VScode,我们需要添加拓展

当然还有很多美化还有功能性的插件,就不在这里多做赘述了。
然后我们输出那句经典的hello world

Go程序需要我们在命令行中切到相应的文件夹(如果没有切换到相应的路径是无法正确运行程序的),然后输入go run ***.go
,可以执行,当然我们也可以先通过go build
编译成.exe
可执行性文件,在run运行文件。
GO开发注意事项
- 后缀为
.go
- 应用程序得执行入口是main()函数
- Go语言严格区分大小写
- Go方法是由一条一条语句构成,每条语句后面不需要就加分号(Go语言会在每一行后自动加分号)
- Go是一行一行编译得,一位内我们一行就写一条语句,不能把多条语句写在同一行
- GO语言定义变量或者import得包如果没有使用到,代码不能编译通过
- 大括号成对出现,缺一不可,
func main(){
必须在一行,不可以把大括号放在下一行会报错
Golang变量的声明
Golang变量声明的三种使用方式
1. 指定变量类型,声明后不赋值,使用默认值
var i int
2. 根据值自行判定变量类型
var num = 10.11
3. 省略var,注意 :=左侧的变量不应该是已经生命过的,否则会导致编译错误
num := "ttdr"
等价于
var name string
name = "ttdr"
多变量声明
同类型多个变量
var n1, n2, n3 int
不同类型多个变量
var n2, name, n3 = 100, "name", 888
类型推导
n2, name, n3 := 100, "name", 888
变量的数据类型
基本数据类型
- 数值型
整形类型(int, int8, int16, int32, int64, uint, uint8, uint16,uint32, unit64, byte)
浮点类型 (float32, float64)
- 字符型(没有专门的字符型,使用byte来保存单个字母字符,不能存汉字,用utf-8编码)
- 布尔型
- 字符串
复杂数据类型
- 指针
- 数组
- 结构体
- 管道
- 函数
- 切片
- 接口
- map(类似于集合)
如何查看某个变量的数据类型和变量所占字节大小
fmt.Printf()
可以用于做格式化输出
var n1 int64 = 100
fmt.Printf("n1 的类型 %T\n n1占用的字节数是 %d ",n1,unsafe.Sizeof(n1))
Sizeof是unsafe包的一个函数,可以返回n1变量占用的字节数,我们要引入unsafe包
整形
整数
类型 | 有无符号 | 占用存储空间(/字节) | 表数范围 | 备注 |
---|---|---|---|---|
int8 | 有 | 1 | -128-127 | |
uint8 | 无 | 1 | 0-255 | |
int16 | 有 | 2 | ||
int32 | 有 | 4 | ||
int64 | 有 | 8 |
第一位表示符号位,为0/1表示正负数,后面几位表示存储的数据
整形
类型 | 有无符号 | 占用存储空间 | 表数范围 | 备注 |
---|---|---|---|---|
int | 有 | 32位四个字节64位8个字节 | ||
uint | 无 | 32位四个字节64位8个字节 | ||
rune | 有 | 与int32一样 | 等价int32,表示一个unicode码,后面在存储中文字符串很有用 | |
byte | 无 | 与uint8一样 | 0-255 | 存储字符的时候使用 |
浮点型
分类:float32——四字节 float64——八字节 (不受OS影响,默认声明位float64)
组成:符号位+指数位+尾数位 (浮点数都是有符号的,尾数为可能丢失导致精度损失)
字符类型
Golang没有专门的字符类型,如果要存储带个字符用byte来存储,
字符串是固定长度的字符连接起来的字符序列,Golang的字符串是由单个字节连接起来的,也就是说 对于传统的字符串由字符组成的,但是GO的字符串是由字节组成的
当我们直接输出byte值,就是输出了对应的字符的ascll码值,如果希望输出对应的字符,需要使用格式化输出

byte的范围是0-255,所以对应的码值如果大于255就会越界,比如我们这里给他赋一个汉字,就会有overflows溢出了

我们这里就给他赋一个更大的范围

正确输出了汉字。
布尔类型
bool 只能是true 或者false,占用一个字节,用于逻辑运算。
字符串类型
基本使用:
var address string = "三角洲启动"
fmt.Println(address)
注意:
1. Golang中的字符串一旦被赋值就不能更改,GO中的字符串是不可变的
2. 字符串两种表示形式,一种是双引号——会识别转义字符,一种是反引号,以字符串原生形式输出,包括换行和特殊字符,可以实现防止攻击, 输出源代码的效果
package main
import (
"fmt"
)
func main(){
var address string = "三角洲启动"
fmt.Println(address)
str2 := `
var n1 int64 = 100
fmt.Printf("n1 的类型 %T\n n1占用的字节数是 %d ",n1,unsafe.Sizeof(n1))
var address string = "三角洲启动"
fmt.Println(address)
`
fmt.Println(str2)
}

3. 字符串的拼接
如果加号两边都是字符串时,加号就会被识别成字符串的拼接

如果是一行太长,需要多行字符串相加,要把加号留在上面。

数据类型的转换
Golang和Java/C不同,不同类型变量之间赋值需要显性转换,在Golang中,数据类型不能自动转换
如果在转换中,转换前的的数据超出了转换后数据的数据范围,会按溢出处理
语法:
var i int32 = 1
var n1 float32 = float32(i)
var n2 int8 = int8(i)
注意:被转换的是变量存储的值,变量本身的数据类型并没有发生变化
基本数据类型和string的转换
方式1:fmt.Sprintf("%参数",表达式)
举例:
var str1 string
str1 = fmt.Sprintf("%d",num1)
fmt.Println(str1)
???不知道参数是什么,看这里点一下
方式2:使用strconv
包的函数
这里放个传送门
var num1 = 99
var num2 float64 = 23.345
var str1 string
str1 = strconv.FormatInt(int64(num1),10)
fmt.Printf("str1:%q",str1)
str1 = strconv.Itoa(num1)
//Int类型(Int64会报错)直接转字符串可以用Itoa函数
fmt.Printf("str1:%q",str1)
str1 = strconv.FormatFloat(num2,'f',10, 64)
//'f'是转成的格式,10表示小数位保留是为,64表示小数是64位
fmt.Printf("str1:%q",str1)
String 转基本数据类型
方式:strconv包函数
var str string = "true"
var b bool
b = strconv.ParseBool(str)
fmt.Printf("type: %T b = %v",b,b)
我们发现这里出现了报错

我们再来查看文档

咱们可以看到这个是返回了两个值,但是我们只关心前面的布尔值那我们就忽略第二个值
b , _ = strconv.ParseBool(str)

得到了正确的结果,这里就字符串转int,就直接上示例了
var str2 string = "12315646"
var n1 int64
n1 , _ = strconv.ParseInt(str2,10,64)
fmt.Printf("type: %T b = %v",n1,n1)
浮点数转字符串同理。
丝,忽然有个坏坏的想法,如果我们不能够转成有效的数据会怎么样呢,我们来试一试。

这里会变成默认值,但是类型是你指定的类型,到这里简单的数据类型基本上就讲完了
结语
一篇一语录,今日语录
明明知道,但就是做不到;特别想要,但就是得不到
——《认知觉醒:开启自我改变的原动力》
但知道和做到之间还有一个核心的东西,就是相信,成功者是因为相信,所以才能看见,普通人是看见了才相信,而愚蠢的人是看见了,也不愿意相信。也应照了笔者很喜欢的一句话,因为相信,所以看见,自命不凡,自证预言。