Go语言基础学习 | 青训营笔记

91 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

Go语言简介

Go语言具有以下特点:

  • 高性能,高并发

    高并发的含义:高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

    • go语言使用协程(goroutine)来处理高并发,它比线程更轻量级,更易用高效,可以同时运行上万个并发任务。
  • 语法简单,学习曲线平缓:go语言可以快速上手,语法相比其他语言更加简单
  • 丰富的标准库:go语言项目不需要依赖特别多第三方库,具有丰富的标准库
  • 完整的工具链
  • 静态链接
  • 快速编译:go语言的编译速度和运行速度相较其他语言都十分优秀
  • 跨平台:go语言支持windows,mac,Linux等多种平台
  • 垃圾回收机制:无需考虑内存的释放
  • 此外,go语言还具有交叉编译特性,在实现某些项目时,无需配置交叉编译环境

Go语言基本语法

变量声明:

  • 方法一:声明一个整型变量,默认值是0
    var a int
    fmt.Println("a=", a)
    
  • 方法二:声明一个变量,初始化一个值
    var b int = 100
    
    var bb string = "1234"
    fmt.Println("b=", b)
    fmt.Printf("bb=%s,type of bb =%T\n", bb, bb)
    
  • 方法三:在初始化的时候可以省去数据类型,通过值自动匹配当前变量的数据类型(不推荐)
    var c = 100
    var cc = "1234c"
    fmt.Println("c=", c)
    fmt.Printf("type of c=%T\n", c)
    
    fmt.Printf("cc=%s,type of cc =%T\n", cc, cc)
    
  • 方法四:(常用的方法)省去var关键字直接自动匹配
    e := 100
    fmt.Printf("type of e=%T\n", e)
    
    g := 3.14
    fmt.Printf("type of g=%T\n", g)
    
    

if-else语句

区别于java或者c语言等,if后面接的表达式不可以带小括号。

循环

golang中只有for循环一种循环。若for后无表达式,则表示一个死循环。

switch-case语句

不同于c语言,case语句下面不需要跟break

数组和切片

数组的定义:

    var myArray1 [10]int

   myArray2 := [10]int{1, 2, 3, 4}

切片slice的定义:

  • 方式一:
    slice1 := []int{1, 2, 3, 4} 
    
  • 方式二:定义slice2为一个切片,但没有分配空间,也不能赋值(会报越界错误)
    var slice2 []int
    //下面给slice2开辟空间
    slice2 = make([]int, 3)
    
  • 方式三:同时开辟空间
    var slice3 []int = make([]int, 4)
    
  • 方式四:常用方式
    slice4 := make([]int, 5)
    

切片扩容机制:切片扩容机制:如果append的时候长度超过容量,容量增加为原来的两倍 下面为演示的例子:

func main() {
   //定义一个长度为3容量为5的切片
   var nums = make([]int, 3, 5)
   fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)

   //向nums追加元素1
   nums = append(nums, 1)
   fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)

   //向nums追加元素2
   nums = append(nums, 2)
   fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)

   /*
      此时再追加,len(nums)就为6了,超过了cap=5,数组进行扩容
      cap = 2*cap
   */
   nums = append(nums, 3)
   fmt.Printf("len=%d,cap=%d,slice=%v\n", len(nums), cap(nums), nums)
}

切片的截取: 截取到下标0,1的元素: s1 := s[0:2] 对于slice,copy函数可以将底层数组的slice一起进行拷贝。拷贝后的slice实际和原slice指向的是同一个空间

map

map里存放键值对(key-value),里面存放的数据完全无序。对于map,使用range来遍历更加的快捷易用

函数

  • 函数的返回类型是后置的。此外,对于go语言的函数,可以有多个返回值
  • 函数的参数中,带指针就可以对它全局的值进行修改;同理,如果是结构体的指针,也可以修改结构体中的值
  • defer:在所在函数的最后执行,如果有多个defer,采用类似压栈的方式,先进后出,先写的defer后执行

错误处理:

可以在返回值中加一个error类型,代表是否出现错误。如果没有出现错误,则err=nil

json

可以用unmarshal方法进行反序列化操作

json转golang struct的网站:oktools.net/json2go

实战中踩得一些坑

猜谜游戏不能输入数字:

解决:

img.png

curl命令不能执行?

在windows安装crul,然后在cmd里运行crul就可以解决了。