Golang-Study-Note

参考教程视频:狂神说

https://www.bilibili.com/video/BV1ae41157o9?p=1&vd_source=7936683721e7dee1c207a6374e8dfb72


一、Golang语言发展史

1.Golang语言的诞生

2.版本发布

3.Go语言使用场景


二、Go语言开发环境搭建

1.下载和安装GO-SDK

Go语言官网:https://golang.org/

Go语言中文网:https://studygolang.com/

安装GO-SDK(SDK即:Software Development Kit 软件开发工具包),Windows系统下可以选择msi(图形界面安装包,根据图形界面提示进行选择和安装),或者zip(编译后的压缩包,解压缩即可使用,需要手动配置环境变量)

2.环境配置

(1)GOROOT

创建GOROOT环境变量存放GO-SDK的安装目录地址

(2)GOPATH

GOPATH存放Go语言项目代码,需要在GOPATH目录下创建src、pkg、bin三个目录

(3)path

在环境变量path中添加%GOROOT%\bin,即GO语言的开发工具(GO-SDK)安装目录下的bin目录,bin目录存放了Go语言的编译工具等。

(4)检查配置是否生效

打开cmd(Win+R),在任意目录下使用go version命令查看GO-SDK的版本,正确输出安装版本即表示环境配置成功。

  1. go version

查看GO-SDK配置的环境

  1. go env

3.下载和安装GoLand

GoLand官网:https://www.jetbrains.com/go/

安装


三、第一个Go语言程序

1.记事本编写GO语言程序并运行

(1)创建一个hello.go文件,使用记事本打开,编写第一个GO语言程序

  1. package main
  2. import "fmt" //导入系统资源包
  3. func main() {
  4. fmt.Printf("Hello World!") //输出指定字符串
  5. }

(2)运行hello.go

在hello.go文件所在目录下打开cmd(在目录地址栏直接输入cmd并enter),使用go run 命令运行GO程序

  1. go run hello.go

(3)运行结果

2.GoLand编写hello.go程序并运行

(1)新建一个GO语言程序

(2)编写hello.go程序

  1. // package Hello_Golang
  2. package main
  3. import "fmt" //导入系统资源包
  4. func main() {
  5. fmt.Printf("Hello World! Hello Golang!") //输出指定字符串
  6. }

运行结果

四、Golang基本语法

1.注释

(1)单行注释
  1. //注释内容
(2)多行注释
  1. /*
  2. 注释内容
  3. */

2.变量

(1)变量的定义

1)标准变量定义

  1. //1.定义变量使用var关键字,注意GO语言的语句不需要分号结尾(这与java和c语言不同)
  2. //2.定义变量的基本格式:var 变量名 变量类型
  3. var name String

2)批量定义多个变量

  1. //批量定义多个变量使用var关键字和大括号
  2. var
  3. name String
  4. age int

3)简短变量的定义

/*

格式化输出使用fmt.Printf()

格式化输出符号:%T数据类型、%t数据值、%s字符串类型、%d数值型

*/

(2)变量交换

GO语言可以直接进行变量值的交换,不需要定义中间变量来暂存变量值。

(3)匿名变量

(4)变量的作用域

(5)常量

常量的定义使用关键字const,GO语言程序中有两种常量定义方式显式定义和隐式定义,隐式定义常量不需要给出常量的数据类型,编译器会自动推到其数据类型。

特殊常量iota

3.数据类型

基本数据类型:

(1)布尔型:bool

其值只能是true或者false

(2)整型:byte、int、int8、int16、int32、int64、uint、uintptr、uint8、uint16、uint32、uint64

int表示有符号,uint表示无符号

int8取值范围:-(27)~(27-1),即 -128 ~ 127

uint8取值范围:0 ~ (2^8-1),即 0 ~ 255

int16、int32、int64、uint16、uint32、uint64...依此类推

(3)浮点型:float32、float64、complex64、complex128

(4)字符串类型:string(注意string的首字母是小写的)

字符使用单引号括起来,字符的类型是int32

字符串使用双引号括起来,字符串类型是string

数据类型转换

GO语言中的数据类型转换必须是显示定义的

派生数据类型:

(1)指针(pointer)

(2)数组(array)

(3)结构体(struct)

(4)通道(channel)

(5)切片(slice)

(6)函数(function func)

(7)接口(interface)

(8)Map

4.运算符

(1)算数运算符

(2)关系运算符

(3)逻辑运算符

(4)位运算符

位运算符是操作二进制数的,与逻辑运算符容易混淆,需要注意

查看二进制数值,控制输出使用符号 %b

(5)赋值运算符

(6)其他运算符

5.获取键盘输入

6.命名规范

7.流程控制语句(程序结构)

(1)顺序结构
(2)分支结构

1)if语句

  1. package main
  2. import "fmt"
  3. // 使用if语句实现学生分数评级
  4. func main() {
  5. fmt.Println("请输入分数:")
  6. var score float32
  7. fmt.Scan(&score)
  8. if score <= 100 && score > 90 {
  9. fmt.Println("A")
  10. } else if score <= 90 && score > 80 {
  11. fmt.Println("B")
  12. } else if score <= 80 && score > 70 {
  13. fmt.Println("C")
  14. } else if score <= 70 && score > 60 {
  15. fmt.Println("D")
  16. } else if score <= 60 && score > 0 {
  17. fmt.Println("不及格")
  18. } else {
  19. fmt.Println("输入的格式不正确!")
  20. }
  21. }

if语句的嵌套

2)switch语句

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // switch语句,匹配的条件是基本数据类型(整型、浮点型、字符串类型和布尔类型)
  6. func main() {
  7. //调用自定义函数
  8. //switch1()
  9. switch2()
  10. }
  11. // 1.switch语句
  12. func switch1() {
  13. fmt.Println("请输入姓名:")
  14. var name string
  15. fmt.Scan(&name)
  16. switch name {
  17. case "John":
  18. fmt.Printf("I am %s\n", "John")
  19. case "Lucy":
  20. fmt.Printf("I am %s\n", "Lucy")
  21. case "Lily":
  22. fmt.Printf("I am %s\n", "Lily")
  23. default:
  24. fmt.Println("不在学生名单中!")
  25. }
  26. }
  27. // 2.fallthrough实现case穿透
  28. func switch2() {
  29. flag := false
  30. switch flag {
  31. case false:
  32. fmt.Println("条件为false")
  33. fallthrough //fallthrough实现case穿透
  34. case true:
  35. //break阻止case穿透
  36. if flag == false {
  37. break
  38. }
  39. fmt.Println("条件为true")
  40. default:
  41. fmt.Println("均不满足条件!")
  42. }
  43. }
(3)循环结构

break和continue

循环结构demo

  1. package main
  2. import "fmt"
  3. /*
  4. GO语言流程控制
  5. 1.顺序结构:存续执行代码
  6. 2.分支结构(选择结构):if语句、switch语句
  7. 3.循环结构:for语句
  8. */
  9. // for语句
  10. func main() {
  11. //调用自定义函数
  12. //for1() //累计求和
  13. //for2() //打印方阵
  14. //for3() //打印九九乘法表
  15. for4() //break和continue
  16. }
  17. func for1() {
  18. /*
  19. 累计求和
  20. */
  21. var sum int
  22. for i := 1; i <= 10; i++ {
  23. sum += i //即sum = sum + i
  24. fmt.Println(sum)
  25. }
  26. fmt.Printf("sum=%d\n", sum)
  27. }
  28. func for2() {
  29. /*
  30. 打印一个5*8的方阵
  31. */
  32. for i := 1; i <= 5; i++ {
  33. for j := 1; j <= 8; j++ {
  34. fmt.Printf(" * ") //打印输出*
  35. }
  36. fmt.Println() //换行
  37. }
  38. }
  39. func for3() {
  40. /*
  41. 打印九九乘法表
  42. */
  43. for i := 1; i <= 9; i++ {
  44. for j := 1; j <= i; j++ {
  45. fmt.Printf("%d*%d=%d ", j, i, i*j)
  46. }
  47. fmt.Println() //换行
  48. }
  49. }
  50. func for4() {
  51. /*break和continue
  52. 1.break:跳出循环
  53. 2.continue:结束本次循环,继续执行下一次循环
  54. */
  55. for i := 0; i <= 5; i++ {
  56. if i == 3 {
  57. break //跳出循环
  58. }
  59. fmt.Println(i)
  60. }
  61. fmt.Println("================ 分隔线 ================")
  62. for i := 0; i <= 5; i++ {
  63. if i == 3 {
  64. continue //跳出本次循环,继续执行下一次循环
  65. }
  66. fmt.Println(i)
  67. }
  68. }
(4)string

字符串相关操作demo

  1. package main
  2. import "fmt"
  3. //字符串相关操作
  4. func main() {
  5. //定义一个字符串str
  6. str := "Hello,World!"
  7. //1.获取字符串长度:使用len函数
  8. fmt.Println(len(str))
  9. fmt.Println("====================================")
  10. //2.获取字符串中的单个字符,下标从0开始计算
  11. fmt.Println(str[6]) //单个字符会打印其在ASCII编码表对应的值
  12. fmt.Printf("%c\n", str[6]) //格式化输出,单个字符使用符号%c
  13. fmt.Println("====================================")
  14. //3.for语句遍历输出字符串的每个字符
  15. for i, v := range str {
  16. fmt.Printf("%d %c\n", i, v) //格式化输出,打印下标和下标对应的字符
  17. }
  18. fmt.Println("====================================")
  19. for i := range str {
  20. fmt.Printf("%c ", str[i])
  21. }
  22. }

8.函数

(1)函数的定义和使用

(2)可变参数 ...

1.函数的参数类型确定,但是参数个数不确定的情况下可以使用可变参数。

2.可变参数一般放在参数列表的最后,一个函数最多只能有一个可变参数。

(3)参数的传递

1.数值型的参数:值传递,即操作数据本身,值传递的是参数值的副本,对原有数据不产生影响。

2.引用型的参数:内存地址的传递,即直接操作在内存地址上,会对该地址的值产生影响。

数组的定义

数组,即

  1. /*
  2. 数组的定义格式:
  3. 数组名 := [数组长度] 数组类型 {value1,value2...value}
  4. */

切片的定义

切片(slice)是可扩容的数组

  1. /*
  2. 切片的定义格式:切片的长度可变,所以不用设置切片的长度
  3. 切片名 := [] 切片类型 {value1,value2...value}
  4. */
(4)变量的作用域

(5)递归函数

1.函数调用本身即为递归,递归函数需要一个出口,避免死循环。

2.一般情况下建议尽可能减少使用递归函数,因为递归会占用较多的内存空间,会降低性能。

(6)defer关键字:延迟执行

多个defer关键字,采用先进后出(栈)的模式

9.函数的高级应用

(1)函数的数据类型

1.函数本身就是一种数据类型,使用格式化输出符号%T可以查看数据类型。

注意:不能带上括号,带上括号时就会调用函数,直接使用函数名即可

2.不带上括号,单个函数名可以看作变量,即可以定义一个函数类型的变量并进行赋值


(2)匿名函数

匿名函数,即没有函数名的函数,一般匿名函数只会执行一次


(3)回调函数和函数的闭包

1.回调函数:将函数作为其他函数的参数,做参乎上的函数称为回调函数

2.函数的闭包:将函数作为其他函数的返回值,形成函数的闭包

高阶函数和回调函数

1.高阶函数:接收其他函数作为参数的函数称为高阶函数

2.回调函数:把自身作为参数的函数称为回调函数

  1. package main
  2. import "fmt"
  3. /*
  4. 函数的高级应用:
  5. 4.回调函数,即将匿名函数作为函数的参数
  6. */
  7. func main() {
  8. //3.调用高阶函数,将自定义的函数作为参数传递
  9. oper(20, 30, addNum)
  10. oper(200, 130, subNum)
  11. //4.也可以将匿名函数直接作为参数
  12. oper(99, 0, func(a, b int) int {
  13. if b == 0 {
  14. fmt.Println("除数不能为0!")
  15. return 0
  16. }
  17. return a / b
  18. })
  19. }
  20. // 1.定义一个高阶函数:接收其他函数作为参数的函数
  21. func oper(a, b int, fun func(int, int) int) {
  22. res := fun(a, b) //调用传递进来的函数,并将返回值赋值给变量res
  23. fmt.Println("res=", res) //输出res的变量值
  24. }
  25. // 2.自定义函数
  26. func addNum(i, j int) int {
  27. return i + j
  28. }
  29. func subNum(i, j int) int {
  30. return i - j
  31. }
函数的闭包

将函数作为其他函数的返回值,形成函数的闭包

  1. package main
  2. /*
  3. 函数的高级应用:
  4. 5.函数的闭包,即将匿名函数作为函数的返回值,形成函数的闭包结构
  5. 实际开发中尽量减少使用闭包结构,因为闭包结构容易造成代码阅读上的混淆,会增加代码维护的成本
  6. */
  7. import "fmt"
  8. func main() {
  9. //调用闭包结构的函数
  10. i := increment()
  11. fmt.Println(i) //2
  12. }
  13. // 定义一个闭包结构的函数
  14. func increment() int {
  15. //1.定义局部变量i
  16. count := 1
  17. //2.定义一个匿名函数,实现自增,使用外层函数的局部变量作为参数并执行
  18. val := func(i int) int {
  19. return count + 1
  20. }(count) //3.内层匿名函数调用了外层函数的局部变量count
  21. //4.将内层函数的返回值返回给外层函数
  22. return val
  23. }

Golang-Study的更多相关文章

  1. win下 golang 跨平台编译

    mac 下编译其他平台的执行文件方式请参看这篇文章,http://www.cnblogs.com/ghj1976/archive/2013/04/19/3030703.html  本篇文章是win下的 ...

  2. golang学习遭遇错误原因分析续

    7. error: reference to field ‘Printf’ in object which has no fields or methods f.Printf("%v&quo ...

  3. golang(2):beego 环境搭建

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46695513 转载请一定注明出处. 1,关于beego beego是一个用Go开 ...

  4. Golang 实现 set 集合,变相实现 切片去重、排序 功能

    Java 中的集合(set)去重很方便,PHP 中的数组值去重,就更加方便,一个函数搞定:array_unique(),Golang 中就比较苦逼了,官方没有提供对“切片去重”的功能,而项目中,又经常 ...

  5. go语言,golang学习笔记4 用beego跑一个web应用

    go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...

  6. Golang OOP、继承、组合、接口

    http://www.cnblogs.com/jasonxuli/p/6836399.html   传统 OOP 概念   OOP(面向对象编程)是对真实世界的一种抽象思维方式,可以在更高的层次上对所 ...

  7. 三、golang时间、流程控、函数

    一.本篇内容 1.string和strconv使用 2.go中的时间和日期类型 3.流程控制 4.函数讲解 二.string和strconv使用 1.  string.HasPrefix(s trin ...

  8. golang学习笔记----并发

    并发模型 并发目前来看比较主流的就三种: 多线程:每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大. 协程:无需抢占式的调度,开销小,可以有效的提高线程的 ...

  9. Golang源码学习:使用gdb调试探究Golang函数调用栈结构

    本文所使用的golang为1.14,gdb为8.1. 一直以来对于函数调用都仅限于函数调用栈这个概念上,但对于其中的详细结构却了解不多.所以用gdb调试一个简单的例子,一探究竟. 函数调用栈的结构(以 ...

  10. Golang源码学习:调度逻辑(一)初始化

    本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...

随机推荐

  1. 图文指南 篇二:虚拟机ESXi6.7安装黑群晖教程

    转载:什么值得买 (ESXI虚拟机是非常好用的多开虚拟机是VM系列非常强的) https://post.smzdm.com/p/agd8l34w/#:~:text=7%E5%AE%89%E8%A3%8 ...

  2. 关于Visual Studio使用头文件"stdafx.h"报错原因

    当我们需要使用"stdafx.h"该头文件时,Visual Studio会报错,提示我们无法打开源文件"stdafx.h",实际上在Visual Studio中 ...

  3. Python:Excel自动化实践入门篇 乙【送图书活动继续】

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/y-npGelPJwmx3iNvHaXRTg 本文上接<Py ...

  4. wwise 音频引擎介绍

    https://blog.csdn.net/GJQI12/article/details/108007696

  5. Linux操作命令(七) 1.cut命令 2.paste命令 3.tr命令

    1.cut 命令 常用参数 参数 描述 -b 以字节为单位进行分割 -c 以字符为单位进行分割 -d 自定义分隔符,默认为制表符 -f 自定义字段 --complement 抽取整个文本行,除了那些由 ...

  6. freeRTOS移植成功

    今天来学习如何移植freeRTOS 也算是走了很多的坑,总算是把系统跑起来了 相关的教程网上也有比较详细的,本文主要说说自己踩的坑 一些汇编文件报错的问题 这个问题的原因是因为网上大部分的移植说明都是 ...

  7. Mybatis-Plus学习

    mybatis-plus 学习 系统环境 jdk8+mysql5.7+springBoot+mybatis最新版本+系统编码UTF-8 文件配置 application.properties # 应用 ...

  8. Linux驱动、应用调试技巧

    原文地址:https://hceng.cn/2019/04/08/Linux%E9%A9%B1%E5%8A%A8%E3%80%81%E5%BA%94%E7%94%A8%E8%B0%83%E8%AF%9 ...

  9. Altium Designer Winter 09 — 01 — 快速创建项目

    新建项目 新建原理图 导入所需的库 添加元器件和接插件 连接导线 自动标注.修改元件属性 编译前--修改项目属性 编译,查看消息 生成网表.BOM.简易BOM,打印文件

  10. RIDE,如何指定report,log,output的存放位置

    创建测试用例,执行后,report.html,log.html,output.txt 会默认存放到 C:\Users\你的用户名\AppData\Local\Temp下, 例如我的存放在 如果要指定存 ...