zoukankan      html  css  js  c++  java
  • Golang 语法学习笔记

    Golang 语法学习笔记

    包、变量和函数。

    • 每个 Go 程序都是由包组成的。
    • 程序运行的入口是包 main
    • 包名与导入路径的最后一个目录一致。"math/rand" 包由 package rand 语句开始。
      import ( "fmt" "math/rand" )
    • 用圆括号组合了导入,是“打包”导入语句。
    • 在 Go 中,首字母大写的名称是被导出的。

    函数

    函数可以没有参数或接受多个参数。注意类型在变量名 之后。
    func add(x int, y int) int { return x + y }
    当两个或多个连续的函数命名参数是同一类型,则除了最后一个类型之外,其他都可以省略。
    x int, y int = x, y int
    函数可以返回任意数量的返回值。
    var 语句定义了一个变量的列表;如果初始化是使用表达式,则可以省略类型;变量从初始值中获得类型。
    := 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。
    函数外的每个语句都必须以关键字开始(varfunc、等等),:= 结构不能使用在函数外。

    Go的基本类型

    Go 的基本类型有Basic types
    bool
    string
    int int8 int16 int32 int64
    uint uint8 uint16 uint32 uint64 uintptr
    byte // uint8 的别名
    rune // int32 的别名
    // 代表一个Unicode码
    float32 float64
    complex64 complex128
    变量在定义时没有明确的初始化时会赋值为_零值_。数值类型为 0,布尔类型为 false,字符串为 ""(空字符串)。
    在定义一个变量但不指定其类型时(使用没有类型的 var 或 := 语句), 变量的类型由右值推导得出。
    常量不能使用 := 语法定义。

    流程控制语句:for、if、else 和 switch

    for

    Go 只有一种循环结构——for 循环。

    for i := 0; i < 10; i++ { sum += i }
    可以让前置、后置语句为空。
    for sum < 1000 { sum += sum }
    如果省略了循环条件,循环就不会结束,因此可以用更简洁地形式表达死循环。

    if switch

    if 语句可以在条件之前执行一个简单的语句。
    没有条件的 switch
    没有条件的 switch 同 switch true 一样。
    这一构造使得可以用更清晰的形式来编写长的 if-then-else 链。
    switch { case t.Hour() < 12: fmt.Println("Good morning!") case t.Hour() < 17: fmt.Println("Good afternoon.") default: fmt.Println("Good evening.") }
    defer 语句会延迟函数的执行直到上层函数返回。延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用。延迟的函数调用被压入一个栈中。当函数返回时, 会按照后进先出的顺序调用被延迟的函数调用。

    复杂类型

    指针

    Go 具有指针。 指针保存了变量的内存地址。类型 T 是指向类型 T 的值的指针。其零值是 nil。& 符号会生成一个指向其作用对象的指针。 符号表示指针指向的底层的值。
    一个结构体(struct)就是一个字段的集合。结构体字段使用点号来访问。
    结构体文法表示通过结构体字段的值作为列表来新分配一个结构体。使用 Name: 语法可以仅列出部分字段。(字段名的顺序无关。)

    数组

    数组的长度是其类型的一部分,因此数组不能改变大小。 这看起来是一个制约,但是请不要担心; Go 提供了更加便利的方式来使用数组。
    一个 slice 会指向一个序列的值,并且包含了长度信息。slice 可以重新切片,创建一个新的 slice 值指向相同的数组。
    for 循环的 range 格式可以对 slice 或者 map 进行迭代循环。

    Map

    map 在使用之前必须用 make 而不是 new 来创建;值为 nil 的 map 是空的,并且不能赋值。
    如果顶级的类型只有类型名的话,可以在文法的元素中省略键名。
    Go 函数可以是闭包的。闭包是一个函数值,它来自函数体的外部的变量引用。 函数可以对这个引用值进行访问和赋值;换句话说这个函数被“绑定”在这个变量上。

    方法和接口

    方法

    Go 没有类。然而,仍然可以在结构体类型上定义方法。方法接收者 出现在 func 关键字和方法名之间的参数中。

    并发

    goroutime

    goroutine 是由 Go 运行时环境管理的轻量级线程。go f(x, y, z)
    开启一个新的 goroutine 执行f(x, y, z)

    channel

    channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值。
    ch <- v // 将 v 送入 channel ch。
    v := <-ch // 从 ch 接收,并且赋值给 v。
    (“箭头”就是数据流的方向。)
    和 map 与 slice 一样,channel 使用前必须创建:
    ch := make(chan int)
    默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。
    channel 可以是 带缓冲的。为 make 提供第二个参数作为缓冲长度来初始化一个缓冲 channel:
    ch := make(chan int, 100)
    channel 与文件不同;通常情况下无需关闭它们。只有在需要告诉接收者没有更多的数据的时候才有必要进行关闭

  • 相关阅读:
    小程序工程化探索:大规模场景下的问题和解决方案----------------引用
    对Taro Next小程序跨框架开发的探索与实践-----------------引用
    对Node.js 中的依赖管理------------引用
    对redux的研究--------引用
    JavaScript 中的 for 循环---------------引用
    对JavaScript 模块化的深入-----------------引用
    对Webpack 应用的研究-----------------引用
    webpack5持久化缓存
    设置x 轴斜体(每次我都百度,这次单独为它发一个)
    字典元组列表常用方法
  • 原文地址:https://www.cnblogs.com/cutd/p/6004363.html
Copyright © 2011-2022 走看看