Go基本语法及入门所遇问题 | 青训营

182 阅读4分钟

Go 语言入门指南:基础语法和常用特性解析

Go基本语法

Go程序的基本结构

package main

import "fmt"

func main() {
   /* 这是我的第一个简单的程序 */
   fmt.Println("Hello, World!")
}
  1. package main定义了包名,必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package mainpackage main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  2. import "fmt"表示导包,可以使用
    • 导入多个包:

      import(
          "fmt"
          "sync"
      )
      
    • 使用别名:

      import (
          "crypto/rand"
          mrand "math/rand" // 将名称替换为mrand避免冲突
      )
      
    • 使用点操作(导入包中所有函数)

      import . "fmt"
      
  3. func main()  是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
  4. 块注释:/*...*/;单行注释://
  5. (GO特性)当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

变量

  • 声明变量的一般形式是使用 var 关键字

    • var identifier type
    • var identifier1, identifier2 type
  • 变量声明不同形式

    • var v_name v_type
      • 未作初始化则为零值
    • var v_name = value
      • 根据值自动判断类型
    • v_name := value
      • 如果变量已经使用 var 声明过了,再使用:=声明变量,就产生编译错误

    以上均可以多变量声明

  • 如果声明了一个局部变量却没有在相同的代码块中使用它,会得到编译错误,但是全局变量是允许声明但不使用的。

  • 常量定义格式:const identifier [type] = value

    • 特殊常量:iota

运算符

  • Go 没有三目运算符,所以不支持  ?:  形式的条件判断。

循环

  • 只有for循环以及for循环嵌套

函数

  • 函数格式
func function_name( [parameter list] ) [return_types] {
   函数体
}
  • 函数可以返回多个值

数组

  • 定义格式

    • var arrayName [size]dataType
  • 初始化

    • var numbers [5]int
    • var numbers = [5]int{1, 2, 3, 4, 5}
    • numbers := [5]int{1, 2, 3, 4, 5}
    • 长度不确定:var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  • Go 数组的长度不可改变

切片

  • 可以看作是“动态数组”,与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

  • 切片定义

    • var identifier []type
    • var slice1 []type = make([]type, len)
    • slice1 := make([]type, len, capacity)
      • len是长度,初始化个数
      • capacity是该切片容量,可选项
      • 切片的容量不可变,如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。
  • 切片初始化

    • 直接初始化:s :=[] int {1,2,3 }
    • 从数组(切片)初始化:s := arr[:] (arr也可以是切片)
    • 从数组(切片)部分初始化:s := arr[startIndex:endIndex]
    • 通过内置函数 make()  初始化:s :=make([]int,len,cap)
  • append()和copy()

    • append()追加变量
    • copy()复制切片

遇到的问题以及解决方案

VScode中package main红线报错(不影响程序运行)

  • 问题截图 image.png

gopls是是 LSP 的一个语言端(Server)实现,是针对 Go 语言的 LSP 实现。LSP,全称 Language Server Protocol,即语言服务器协议,这是微软创建的一个协议(目前已有 Codenvy,Red Hat 和 Sourcegraph 等公司一起支持它的发展),定义了在编辑器或 IDE 中与语言服务器之间使用的协议。该语言服务器提供诸如自动完成,转到定义,查找所有引用等语言功能。