Go语言入门三 | 青训营笔记

77 阅读5分钟

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

Go语言的重要语法

  1. switch:语法结构与其他语言类似

    1. 不需要单独书写break语句,已内置
    2. 若需要使用break,可以在case中添加fallthrough(穿透)—不推荐使用
    3. switch后面不一定非要常量、整型、布尔型,也可以是表达式,只要表达式的结果是相同类型的就可以:switch {case 表达式:}也成立
    4. switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型??????。
  2. for循环

    1. 三种形式

      1. for 初始条件;循环条件;增量{}——等同于其他语言的for
      2. for 循环条件{}/for ;循环条件;{}—等同于while
      3. for{}—死循环
    2. for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。—foreach

      strings := []string{"孙", "Baidu"}

      for i, s := range strings { fmt.Println(i, s)}

    3. 字符串的迭代(处理中文乱码问题)

      1. for range遍历很智能,默认是使用字符的方式遍历,因此字符串有中文,也可以遍历

      2. 若使用一般形式,需要先转为数组才能遍历

        string := "孙尚晴"

        str := []rune(string)

        for _, i2 := range str { fmt.Printf("%c", i2)}

  3. while和do while

    1. while

      循环变量初始化 for{ if 循环判断语句{ break //跳出for循环 } 循环操作 循环变量迭代 } or for 循环判断{ 循环操作 }

    2. do while循环变量初始化 for{ 循环操作 循环变量迭代 if循环条件表达式{ break //跳出for循环 } }

  4. break、continue、goto、return

    1. break

      1. 调出循环:for or 多重循环
      2. 调到label
    2. continue

      1. 跳过当前循环,到下一轮,for增量
      2. continue label
    3. goto:不推荐使用

    4. return:跳出函数

  5. Python中的循环和字符串遍历

    1. for i in range(2,10,2)—2,4,6,8
    2. 字符串遍历无需担心乱码问题
    3. while后面存在else

函数、init函数和包

  1. 函数的基本定义

    1. 语法格式

      func 函数名(参数列表,用逗号分割)(返回值列表){
      		函数体
      }
      
      • **parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。**
      • **return_types:返回类型,函数返回一列值。 return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。可以有返回值,也可以没有**
    2. return:

      1. 如果返回多个值时,在接受时,希望忽略某个返回值,则使用_表示忽略
      2. 如果返回值只有一个,返回值类型列表可以不写()
    3. 函数调用:使用函数名,并传参

    4. 递归调用:理解底层栈的思维

      1. 执行一个函数的时候,就创建了一个受保护的独立空间(新函数栈)
      2. 函数的局部变量是独立的,不会相互影响
      3. 递归要有出口,否则无线递归
      4. 函数执行完毕或者遇见return会遵守谁调用,就将返回结果给谁,同时,当函数执行完毕时,或者返回时,该函数本身也会被系统销毁(栈先进后出)
    1. 作用

      1. 区分相同名字的函数、变量等标识符
      2. 当程序文件很多时,可以很好的管理项目
      3. 控制函数、变量等访问,即作用域
    2. 使用

      1. 打包:package main

      2. 引包:import

      3. 调用:只有大写字母才能被导出

      4. 注意

        1. 包的路径:是从项目文件夹里面的第一层文件开始的,到该包(mod包不是)

        2. 包名最好和文件夹名保持一致。

        3. 打包指令放在第一行,然后是import指令,然后是函数的执行

        4. 如果包名比较长,Golang支持给包起别名,但是起别名之后原来的包不能使用

          import (
          	"fmt"
          	newutil "go_code/chapter/fundemo01/util"
          ) //注意:此时原来的包util不能再用了
          
        5. 如果两个相同函数名不在一个文件,但是在同一个包下,此时也会报错,即一个包下可以有多个文件

        6. **main包只有一个,而且只能是main可以形成可执行文件**

  2. 值传递&引用传递

    1. 默认值传递,即使是数组也是值传递(与JAVA不同)

    2. 引用传递可以用指针*实现(没有学的切片和map也能够实现)

      func swap(x *int, y *int) {
         var temp int
         temp = *x    /* 保存 x 地址上的值 */
         *x = *y      /* 将 y 值赋给 x */
         *y = temp    /* 将 temp 值赋给 y */
      }
      
  3. 函数的重载(不支持)

    1. 不允许相同的函数名,会报错,但是Python就不会报错(忽略上一个)

    2. 函数本身也是一种数据类型,,可以赋值给一个变量,该变量就是函数类型的变量,通过该变量实现对函数类型的调用

    3. 函数也可以作为实参传递

    4. 自定义数据类型type myint int

      1. 类似于Integer和int,不认为int和myInt是相同类型,此时需要显示转换

      2. Integer和int的比较

        1. 两个new的Integer“==”为false
        2. 一个new,一个非new,“==”false
        3. 一个Integer,一个int。“==”true
    5. 支持返回值命名,不仅省略了return,也不需要考虑顺序

    6. 支持可变参数args,使用下标访问

      func sum(n1 int,args... int)int{
          sum := n1
          //遍历args
          for i:= 0;i<len(args);i++{
              sum += args[i]
          }
          return sum
      }
      
  4. init函数

    1. 全局变量→init初始化→main
    2. 先外包的全局和init,再当前包的全局和init
  5. Python中的函数

    def 函数名():
    代码
    
    • 不存在重载,但不报错,只会忽略
    • 全局变量global
    • 函数的多个返回值可以用元组接收也可以用多个变量(以逗号分割)接收