Go语言初识 | 青训营笔记

37 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、本堂课重点内容:

  • 变量
  • 循环
  • 条件判断
  • 分支
  • 数组
  • 切片
  • map
  • 遍历
  • 函数
  • 指针
  • 结构体
  • 结构体方法
  • 错误
  • 字符串
  • 输出
  • json串
  • 字符串与数字转换
  • 进程
  • 项目
    • 猜数字
    • 字典
    • socks5代理

二、详细知识点介绍:

Go 语言的基础组成有以下几个部分:

包声明 引入包 函数 变量 语句 & 表达式 注释

package main  
 
import "fmt"  
 
func main() {  
    /* 这是我的第一个简单的程序 */  
    fmt.Println("Hello, World!")  
}
  1. 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  2. 下一行 import "fmt"  告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
  3. 下一行 func main()  是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
  4. 下一行 /.../ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
  5. 下一行 fmt.Println(...)  可以将字符串输出到控制台,并在最后自动增加换行字符 \n。
    使用 fmt.Print("hello, world\n") 可以得到相同的结果。
    Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。
  6. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
  • 变量

    • 声明变量有4种方法
    var a = "initial"  //var 变量名 = 变量值
    
    var b, c int = 1, 2  //var 变量名 变量类型 = 变量值  (变量类型可省略)
    
    var d float64  //var 变量名 变量类型
    d = 3.14  //赋值
    
    f := float32(e)  //变量名 := 变量值
    
  • 循环

    • 死循环
     for {
        fmt.Println("loop")
        break
     }
    
    • 普通循环
    for j := 7; j < 9; j++ {
       fmt.Println(j)
    }
    

    * 循环没有小括号

  • 条件判断

    • 单条件判断
    if 7%2 == 0 {
       fmt.Println("7 is even")
    } else {
       fmt.Println("7 is odd")
    }
    

    * 条件判断没有小括号

    • 多条件判断
    if num := 9; num < 0 {
       fmt.Println(num, "is negative")
    } else if num < 10 {
       fmt.Println(num, "has 1 digit")
    } else {
       fmt.Println(num, "has multiple digits")
    }
    
  • 分支

    • 分支
    switch a {
    case 1:
       fmt.Println("one")
    case 2:
       fmt.Println("two")
    case 3:
       fmt.Println("three")
    case 4, 5:
       fmt.Println("four or five")
    default:
       fmt.Println("other")
    }
    

    * 没有break

  • 数组

    • 声明
      var a [5]int
      a[4] = 100
    
      b := [5]int{1, 2, 3, 4, 5}
    
  • 切片

    • Go 语言切片是对数组的抽象。slice
    • 声明
    s := make([]string, 3)
    

    * 理解的话,就像C++中的vector,Java中的ArrayList

  • map

    • Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
    • 声明
    m := make(map[string]int)
    m2 := map[string]int{"one": 1, "two": 2}
    var m3 = map[string]int{"one": 1, "two": 2}
    
    • 赋值
    m["one"] = 1
    m["two"] = 2
    
    • 输出
    fmt.Println(m["one"])    // 1
    fmt.Println(m["unknow"]) // 0
    
    r, ok := m["unknow"]
    fmt.Println(r, ok) // 0 false
    
    • 删除
    delete(m, "one")
    
  • 遍历

    • Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
    • 格式
    nums := []int{2, 3, 4}
    for i, num := range nums {
       fmt.Println("index:", i, "num:", num) // index: 0 num: 2
    }
    
    m := map[string]string{"a": "A", "b": "B"}
    for k, v := range m {
       fmt.Println(k, v) // b 8; a A
    }
    
  • 函数

    • Go 语言最少有个 main() 函数。你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称,返回类型,和参数。
    • 声明
    func add(a int, b int) int {    //func 函数名(形参名 形参类型) 返回值类型{}
       return a + b
    }
    
    func exists(m map[string]string, k string) (v string, ok bool) {
       v, ok = m[k]
       return v, ok
    }
    
    func main() {
       res := add(1, 2)
       fmt.Println(res) // 3
    
       v, ok := exists(map[string]string{"a": "A"}, "a")
       fmt.Println(v, ok) // A True
    }
    
  • 指针

    • Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
    • 格式
    func add2ptr(n *int) {
       *n += 2
    }
    
    func main() {
       n := 5
       add2ptr(&n)
       fmt.Println(n) // 7
    }
    

    * 和C一样想在函数体里面更改函数外的变量,就要用到指针。

  • 结构体

    • Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
    • 格式
    type user struct {
       name     string
       password string
    }
    
    • 声明输出
    a := user{name: "wang", password: "1024"}
    b := user{"wang", "1024"}
    c := user{name: "wang"}
    c.password = "1024"
    var d user
    d.name = "wang"
    d.password = "1024"
    
    fmt.Println(a, b, c, d)                 // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
    
  • 结构体方法

    • 格式
    func (u *user) resetPassword(password string) {
       u.password = password
    }
    
    func main() {
       a := user{name: "wang", password: "1024"}
       a.resetPassword("2048")
       fmt.Println(a.checkPassword("2048")) // true
    }
    

    * func (变量名 *变量类型) 变量名 (形参值 形参类型){}
    * 理解起来就像类中方法 只不过分开了

  • 错误

    • 格式
    err error = errors.New("not found")
    
  • 字符串

    • Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
  • json串

    • json
  • 输出

    • fmt
  • 字符串与数字转换

    • strconv

三、实践练习例子:

  • 项目
    • 猜数字
    • 字典
    • socks5代理

四、课后个人总结:

个人初始Go语言觉得难度还好,不算太难。只是觉得变量声明这里和其他语言确实不太一样。其他还好。

五、引用参考:

  • 代码引用自课堂文件
  • 相关介绍引用自菜鸟教程