Go 语言入门指南:基础语法和常用特性解析
Go基本语法
Go程序的基本结构
package main
import "fmt"
func main() {
/* 这是我的第一个简单的程序 */
fmt.Println("Hello, World!")
}
package main定义了包名,必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。import "fmt"表示导包,可以使用-
导入多个包:
import( "fmt" "sync" ) -
使用别名:
import ( "crypto/rand" mrand "math/rand" // 将名称替换为mrand避免冲突 ) -
使用点操作(导入包中所有函数)
import . "fmt"
-
func main()是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。- 块注释:
/*...*/;单行注释:// - (GO特性)当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
变量
-
声明变量的一般形式是使用 var 关键字
var identifier typevar 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]intvar 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 []typevar 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红线报错(不影响程序运行)
- 问题截图
gopls是是 LSP 的一个语言端(Server)实现,是针对 Go 语言的 LSP 实现。LSP,全称 Language Server Protocol,即语言服务器协议,这是微软创建的一个协议(目前已有 Codenvy,Red Hat 和 Sourcegraph 等公司一起支持它的发展),定义了在编辑器或 IDE 中与语言服务器之间使用的协议。该语言服务器提供诸如自动完成,转到定义,查找所有引用等语言功能。
- 虽然报错,但能够运行得到结果
- 处理方案
- (未解决) 网上搜索出来的处理方案,但是尝试后未解决:VScode中选择 文件-首选项-设置-拓展-Go 有一个在setting.json中编辑添加
"gopls": {“experimentalWorkspaceModule": true}。 - 在了解完GoPath和Go Modules后,使用
go mod init ${项目名称}$,同时保证VsCode工作目录下(不包含子目录)包含go.mod文件,package main不再报错(Go Modules用于代替GoPath实现依赖管理)
- (未解决) 网上搜索出来的处理方案,但是尝试后未解决:VScode中选择 文件-首选项-设置-拓展-Go 有一个在setting.json中编辑添加
- 参考链接