学习路线

2023-Go全链路工程师课纲 https://www.processon.com/view/link/63594cd97d9c0854f9ac855e

一、搭建环境

https://studygolang.com/dl

msi需要自己安装

安装目录最好没有中文

1. 简单dos命令

  1. 进入磁盘 D:, C:

  2. 查看目录结构 dir

  3. 进入目录 cd

  4. 目录层级 .代表当前目录,..代表上一层目录

  5. 补全 tab

  6. 创建 md

  7. 删除文件夹 rm

  8. 删除文件 del

2. 环境变量配置

如果我想要在任意的路径下执行某个命令,需要将这个命令所在的目录配置到环境变量path中去

将命令“注册”到当前的计算机中:

解决如下错误:

加入环境变量后,需要重启 命令窗口

二、简单编写

在vscode中创建文件目录如下:

在命令行中执行go build命令进行编译,在运行.exe执行文件,可获得结果

或者是go run直接获取运行结果

1.执行流程

如果先编译生成了可执行女件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行

如果直接go run go源代码,那么如果要在另外一个机器上这么运行,需要go开发环境,否则无法执行。

2.语法注意事项

(1)源文件以"go"为扩展名。

(2)程序的执行入口是main()函数。

(3)严格区分大小写。

(4)方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。

(5)Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错

(6)定义的变量或者import的包如果没有使用到,代码不能编译通过。

(7)大括号都是成对出现的,缺一不可

3.代码风格

【1】注意缩进

向后缩进:tab

向前取消缩进:shift+tab

通过命令完成格式化操作:

【2】成对编程 {} () “” ‘’

【3】运算符两边加空白

【4】注释:官方推荐行注释//

【5】以下代码是错误的:

原因:go的设计者想要开发者有统一的代码风格,一个问题尽量只有一个解决方案是最好的

【6】行长约定:

一行最长不超过80个字符,超过的请使用换行展示,尽量保持格式优雅

三、变量

1.声明与使用

变量相当于内存中一个数据存储空间的表示

  1. package main
  2. import "fmt"
  3. func main () {
  4. var age int = 20
  5. fmt.Println("age = ", age)
  6. }

2.多种使用方式

  1. //第一种:变量的使用方式:指定变量的类型,并且赋值,
  2. var num int = 18
  3. fmt.Println(num)
  4. //第二种:指定变量的类型,但是不赋值,使用默认值
  5. var num2 int
  6. fmt.Println(num2)
  7. //第三种:如果没有写变量的类型,那么根据=后面的值进行判定变量的类型 (自动类型推断)
  8. var num3 = "tom"
  9. fmt.Println(num3)
  10. //第四种:省略var,注意 := 不能写为 =
  11. sex := "男"
  12. fmt.Println(sex)

3.支持多变量声明

  1. var n1,n2,n3 int
  2. fmt.Println(n1)
  3. fmt.Println(n2)
  4. fmt.Println(n3)
  5. var n4,name,n5 = 10,"jack",7.8
  6. fmt.Println(n4)
  7. fmt.Println(name)
  8. fmt.Println(n5)
  9. n6,height := 6.9,100.6
  10. fmt.Println(n6)
  11. fmt.Println(height)

4.全局变量(两种)

  1. //全局变量:定义在函数外的变量
  2. var n7 = 100
  3. var n8 = 9.7
  4. //设计者认为上面的全局变量的写法太麻烦了,可以一次性声明:
  5. var (
  6. n9 = 500
  7. n10 = "netty"
  8. )
  9. func main(){

四、进制转换

1.进制的介绍:

十进制整数,如:99, -500, 0

八进制整数,要求以 0 开头,如:015

十六进制数,要求 0x 或 0X 开头,如:0x15

二进制:要求0b或者0B开头,如:0b11

几进制:就是逢几进1的问题:

平时实际生活中用的最多的是:十进制

计算机用二进制最多

2.二进制转换为十进制

二进制: 1101

  1. 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0

= 8 + 4 + 0 + 1

= 13

3.十进制转换为二进制:

十进制 13

4.八进制转换十进制:

八进制: 16

18^1 + 68^0

= 8 + 6

=14

5.十进制转换为八进制:

十进制14:

6.八进制转换为十六进制:

把十进制当做一个中转站:

八进制---》十进制---》十六进制

实际上根本不用自己转换这么麻烦:我们可以直接用系统中提供给我们的计算器:

五、数据类型

如何选择

Golang程序中整型变量在使用时,遵守保小不保大的原则

即:在保证程序正确运行下,尽量使用占用空间小的数据类型

1.基本数据类型

1.整数类型

1.1有符号整数类型

一字节占8位

PS:127怎么算出来的?

01111111 -->二进制 ---》转为十进制:

12^6 + 12^5 + 12^4 + 12^3 + 12^2 + 12^1 + 1*2^0

= 64 + 32 + 16 + 8 + 4 + 2 + 1

= 127

代码测试超出范围:

1.2无符号整数类型:

1.3其他整数类型:

2.浮点类型

种类

3.字符类型

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

【2】Golang中字符使用UTF-8编码

【3】ASCII码表:

左面是不可见字符 右面是可见字符

转义字符

4.布尔类型

【1】布尔类型也叫bool类型,bool类型数据只允许取值true和false

【2】布尔类型占1个字节。

【3】布尔类型适于逻辑运算,一般用于程序流程控制

【4】代码:

  1. package main
  2. import "fmt"
  3. func main(){
  4. //测试布尔类型的数值:
  5. var flag01 bool = true
  6. fmt.Println(flag01)
  7. var flag02 bool = false
  8. fmt.Println(flag02)
  9. var flag03 bool = 5 < 9
  10. fmt.Println(flag03)
  11. }

5.字符串类型(java中不属于基本数据类型)

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

字符串的使用:

如果字符串中有特殊字符,字符串的表示形式用反引号 ``

  1. package main
  2. import "fmt"
  3. func main(){
  4. //1.定义一个字符串:
  5. var s1 string = "你好全面拥抱Golang"
  6. fmt.Println(s1)
  7. //2.字符串是不可变的:指的是字符串一旦定义好,其中的字符的值不能改变
  8. var s2 string = "abc"
  9. //s2 = "def"
  10. //s2[0] = 't'
  11. fmt.Println(s2)
  12. //3.字符串的表示形式:
  13. //(1)如果字符串中没有特殊字符,字符串的表示形式用双引号
  14. //var s3 string = "asdfasdfasdf"
  15. //(2)如果字符串中有特殊字符,字符串的表示形式用反引号 ``
  16. var s4 string = `
  17. package main
  18. import "fmt"
  19. func main(){
  20. //测试布尔类型的数值:
  21. var flag01 bool = true
  22. fmt.Println(flag01)
  23. var flag02 bool = false
  24. fmt.Println(flag02)
  25. var flag03 bool = 5 < 9
  26. fmt.Println(flag03)
  27. }
  28. `
  29. fmt.Println(s4)
  30. //4.字符串的拼接效果:
  31. var s5 string = "abc" + "def"
  32. s5 += "hijk"
  33. fmt.Println(s5)
  34. //当一个字符串过长的时候:注意:+保留在上一行的最后
  35. var s6 string = "abc" + "def" + "abc" + "def" + "abc" + "def" + "abc" +
  36. "def"+ "abc" + "def" + "abc" + "def"+ "abc" + "def" + "abc" + "def"+
  37. "abc" + "def" + "abc" + "def"+ "abc" + "def" + "abc" + "def"+ "abc" +
  38. "def" + "abc" + "def"+ "abc" + "def" + "abc" + "def"+ "abc" + "def" +
  39. "abc" + "def"+ "abc" + "def"
  40. fmt.Println(s6)
  41. }

默认值

2.基本数据类型转换

Go在不同类型的变量之间赋值时需要显式转换,并且只有显式转换(强制转换)。

  1. package main
  2. import "fmt"
  3. func main(){
  4. //进行类型转换:
  5. var n1 int = 100
  6. //var n2 float32 = n1 在这里自动转换不好使,比如显式转换
  7. fmt.Println(n1)
  8. //fmt.Println(n2)
  9. var n2 float32 = float32(n1)
  10. fmt.Println(n2)
  11. //注意:n1的类型其实还是int类型,只是将n1的值100转为了float32而已,n1还是int的类型
  12. fmt.Printf("%T",n1) //int
  13. fmt.Println()
  14. //将int64转为int8的时候,编译不会出错的,但是会数据的溢出
  15. var n3 int64 = 888888
  16. var n4 int8 = int8(n3)
  17. fmt.Println(n4)//56
  18. var n5 int32 = 12
  19. var n6 int64 = int64(n5) + 30 //一定要匹配=左右的数据类型
  20. fmt.Println(n5)
  21. fmt.Println(n6)
  22. var n7 int64 = 12
  23. var n8 int8 = int8(n7) + 127 //编译通过,但是结果可能会溢出
  24. //var n9 int8 = int8(n7) + 128 //编译不会通过
  25. fmt.Println(n8)
  26. //fmt.Println(n9)
  27. }

3.基础数据类型转String类型

3.1 方法一

  1. package main
  2. import "fmt"
  3. func main(){
  4. var n1 int = 19
  5. var n2 float32 = 4.78
  6. var n3 bool = false
  7. var n4 byte = 'a'
  8. var s1 string = fmt.Sprintf("%d",n1)
  9. fmt.Printf("s1对应的类型是:%T ,s1 = %q \n",s1, s1)
  10. var s2 string = fmt.Sprintf("%f",n2)
  11. fmt.Printf("s2对应的类型是:%T ,s2 = %q \n",s2, s2)
  12. var s3 string = fmt.Sprintf("%t",n3)
  13. fmt.Printf("s3对应的类型是:%T ,s3 = %q \n",s3, s3)
  14. var s4 string = fmt.Sprintf("%c",n4)
  15. fmt.Printf("s4对应的类型是:%T ,s4 = %q \n",s4, s4)
  16. }

3.2 方法二

  1. package main
  2. import(
  3. "fmt"
  4. "strconv"
  5. )
  6. func main(){
  7. var n1 int = 18
  8. var s1 string = strconv.FormatInt(int64(n1),10) //参数:第一个参数必须转为int64类型 ,第二个参数指定字面值的进制形式为十进制
  9. fmt.Printf("s1对应的类型是:%T ,s1 = %q \n",s1, s1)
  10. var n2 float64 = 4.29
  11. var s2 string = strconv.FormatFloat(n2,'f',9,64)
  12. //第二个参数:'f'(-ddd.dddd) 第三个参数:9 保留小数点后面9位 第四个参数:表示这个小数是float64类型
  13. fmt.Printf("s2对应的类型是:%T ,s2 = %q \n",s2, s2)
  14. var n3 bool = true
  15. var s3 string = strconv.FormatBool(n3)
  16. fmt.Printf("s3对应的类型是:%T ,s3 = %q \n",s3, s3)
  17. }

4.String类型转为基础数据类型


  1. func main(){
  2. //string-->bool
  3. var s1 string = "true"
  4. var b bool
  5. //ParseBool这个函数的返回值有两个:(value bool, err error)
  6. //value就是我们得到的布尔类型的数据,err出现的错误
  7. //我们只关注得到的布尔类型的数据,err可以用_直接忽略
  8. b , _ = strconv.ParseBool(s1)
  9. fmt.Printf("b的类型是:%T,b=%v \n",b,b)
  10. //string---》int64
  11. var s2 string = "19"
  12. var num1 int64
  13. num1,_ = strconv.ParseInt(s2,10,64)
  14. fmt.Printf("num1的类型是:%T,num1=%v \n",num1,num1)
  15. //string-->float32/float64
  16. var s3 string = "3.14"
  17. var f1 float64
  18. f1,_ = strconv.ParseFloat(s3,64)
  19. fmt.Printf("f1的类型是:%T,f1=%v \n",f1,f1)
  20. //注意:string向基本数据类型转换的时候,一定要确保string类型能够转成有效的数据类型,否则最后得到的结果就是按照对应类型的默认值输出
  21. var s4 string = "golang"
  22. var b1 bool
  23. b1 , _ = strconv.ParseBool(s4)
  24. fmt.Printf("b1的类型是:%T,b1=%v \n",b1,b1)
  25. var s5 string = "golang"
  26. var num2 int64
  27. num2,_ = strconv.ParseInt(s5,10,64)
  28. fmt.Printf("num2的类型是:%T,num2=%v \n",num2,num2)
  29. }

Go学习笔记1的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. 设置nginx允许服务端跨域

    目前项目大多使用前后端分离的模式进行开发,跨域请求当然就是必不可少了,很多时候我们会使用在客户端的ajax 请求中设置跨域请求,也有的在服务端设置跨域.但是有时候会遇到不使用ajax也没有使用后端服务 ...

  2. Golang扫盲式学习——GO并发 | (一)

    并发与并行 并发与并行的概念和区别 并行:同一个时间段内多个任务同时在不同的CPU核心上执行.强调同一时刻多个任务之间的"同时执行". 并发:同一个时间段内多个任务都在进展.强调多 ...

  3. Java流程控制和循环(基础语法学习)

    一.流程控制 1.定义 ​ 在一个Java程序中,各条语句的执行对程序的结果有直接影响,也就是说 各个语句的执行顺序对程序的结果有直接影响. ​ 在程序中 ,可能出现不同的执行顺序,必须 自上而下顺序 ...

  4. 使用默认pypi源出现连接超时

    背景信息 安装 dataworks sdk 时报错,原因是连接默认的 pypi 仓库超时 pip install aliyun-python-sdk-dataworks-public==4.2.1 报 ...

  5. C++面试八股文:std::array如何实现编译器排序?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官:array熟悉吗? 二师兄:你说的是原生数组还是std::array? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生 ...

  6. 把jar包打成docker镜像并推送到Docker Hub

    1.准备需要的jar包并复制到服务器某个目录下 2.在此目录下,创建Dockerfile的文本文件,并将以下内容添加到文件中: # 基础镜像 FROM openjdk:8-jre # author(可 ...

  7. Android BottomNavigation底部导航栏使用

    原文地址: Android BottomNavigation底部导航栏使用 - Stars-One的杂货小窝 基本使用 本文侧重点记录一些特殊的样式设置,所以基本使用这里就简单概述一下,详细图文可以去 ...

  8. Profinet转EtherNet/IP网关连接AB PLC的应用案例

    西门子S7-1500 PLC(profinet)与AB PLC以太网通讯(EtherNet/IP).本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关,连接西门子S7- ...

  9. 推荐一款.NET开源跨平台的开箱即用的DNS服务器软件

    前言 今天要给大家推荐一款.NET开源跨平台的开箱即用的DNS服务器软件(用于提供 DNS 解析服务):Technitium DNS Server. 项目介绍 Technitium DNS Serve ...

  10. C#数据去重的这几种方式,你知道几种?

    前言 今天我们一起来讨论一下关于C#数据去重的常见的几种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式.当然欢迎你在评论区留下你觉得更好的数据去重的方式. 使用HashSet去重 ...