Go 笔记之程序结构

同其它语言一样,Go也有顺序,分支,循环三大程序结构,只不过它更精炼。

顺序

  • if 条件判断(许初始化变量)
    • 条件判断语句里面允许声明一个变量,该变量的作用域只能在该条件逻辑块内
  • goto 无条件跳转

    • 用goto 跳转到必须在当前函数内定义的标签
    • 标签名是大小写敏感的。

          func myFunc() {
              i := 0
          Here:   // 这行的第一个词,以冒号结束作为标签
              println(i)
              i++
              goto Here   // 跳转到 Here 去
          }
      

循环

  • for
    • 循环读取数据,可作while控制逻辑(注意 golang中无while语句)
          sum := 1
          for sum < 1000 {
              sum += sum
          }
    • 迭代操作
      • for 配合 range 可以用于读取 slice 和 map 的数据
      • break 和 continue 还可以跟着标号,用来跳到多重循环中的外层循环
    • 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面

分支

  • switch

    • 表达式不必是常量或整数
    • 执行的过程从上至下,直到找到匹配项
    • 如果 switch 没有表达式,它会匹配 true。
    • switch 默认相当于每个 case 最后带有 break,匹配成功跳出整个switch,可以使用 fallthrough 强制执行后面的 case 代码。

          i := 10
          switch i {
          case 1:
              fmt.Println("i is equal to 1")
          case 2, 3, 4:
              fmt.Println("i is equal to 2, 3 or 4")
          case 10:
              fmt.Println("i is equal to 10")
              fallthrough
          default:
              fmt.Println("All I know is that i is an integer")
          }
      

函数

  • 特点

    • 支持多值返回,命名返回值,必须声明类型
    • 函数可以有一个或者多个参数,每个参数后面带有类型,通过,分隔
    • 可命名返回参数的变量,若函数是导出建议命名返回值

          func SumAndProduct(A, B int) (add int, Multiplied int) {
              add = A+B
              Multiplied = A*B
              return
          }
      
          // 支持变参
          func myfunc(arg ...int) {}
          type testInt func(int) bool // 声明了一个函数类型
      
  • 传值 vs 传指针

    • 传参实际上是传值,其值可以是变量的值,也是可以是变量的地址,即指针
    • 变量在内存中是存放于一定地址上的,修改变量实际是修改变量地址处的内存
    • 传指针使得多个函数能操作同一个对象。
    • 传指针比较轻量级 (8bytes),只是传内存地址,指针传递体积大的结构体
    • 若用参数值传递的话, 在每次 copy 上面就会花费相对较多的系统开销(内存和时间)
    • Go 语言中 channel,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针

关键字

  • defer规则
    • 多个defer调用 defer,那么 defer 是采用后进先出模式
    • defer 后指定的函数会在函数退出前调用
    • 当函数执行到最后时,这些 defer 语句会按照逆序执行,最后该函数返回。
  • 函数可作为值类型,常用在写通用接口
    • panic Recover
    • main init
      • init 函数 能够应用于所有的 package,可选
      • main 函数(只能应用于 package main,必选)
      • 这两个函数在定义时不能有任何的参数和返回值。
      • 程序的初始化和执行都起始于 main 包
      • 流程
        1. main导入包
        2. 对导入包内的常量和变量进行初始化
        3. 执行导入包内的init函数
        4. 对main包中的包级常量和变量进行初始化,执行main包init,main函数
  • 关键字列表
    • defer 用于类似析构函数
    • go 用于并发
    • select 用于选择不同类型的通讯
    • interface 用于定义接口
    • struct 用于定义抽象数据类型
    • chan 用于 channel 通讯
    • type 用于声明自定义类型
    • map 用于声明 map 类型数据
    • range 用于读取 slice、map、channel 数据

import

  • GOROOT 环境变量指定目录下去加载该模块
              // 当前文件同一目录的 model 目录,但是不建议这种方式来 import
              import "./model"
              // 绝对路径 加载 gopath/src/shorturl/model 模块
              import "shorturl/model"
  • import 简化行为 - 点 省略前缀的包名 - 别名 - _ 调用包里面的 init 函数

        import (
            // 即调用 fmt.Println("hello world") 可以省略的写成 Println("hello world")
            . "fmt"
        )
    
        import(
            // 即可 f.Println("hello world")
            f "fmt"
        )
    
        import (
            "database/sql"
            // 调用了该包内的init函数,但不对其它内容进行导入处理
            _ "github.com/ziutek/mymysql/godrv"
        )
本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
134
粉丝
24
喜欢
101
收藏
55
排名:106
访问:8.9 万
私信
所有博文
社区赞助商