这是我参与第五届青训营办学笔记创作的第7天。
环境搭建
进入官网下载golan.google.cn/dl 安装完毕后,会自动在配置文件中加入一些内容。 其中比较重要的三个是:
GOROOT(具体GO语言在硬盘上安装的位置,比如D:/GO)
GOPATH(未来使用go install安装第三方工具包时,都会安装在GOPATH指定文件夹下的src或bin目录下,比如C:/Users/Administrator/Go)
最后一个是GO语言安装路径下的bin文件夹路径(例如:D:/GO/bin)添加到PATH中。
在终端输入
go version
在终端输入
go env
检查目前已经设置的所有与GO语言相关的配置情况 并添加代理,因为如果不挂可能会导致下载速度过低,代理如下,可通过终端进行设置:
go env -w GOPROXY="https://goproxy.cn,direct"
go env -w GOPROXY="https://goproxy.io"
go env -w GOPROXY="https://mirrors.tencent.com/go/"
VScode安装
此部分直接点击下载即可
在配置go开发环境时直接安装所有的相关插件即可,因为已经设置过代理,所以下载速度会较快
go基础语法
变量
声明变量一般是用var关键字
var name type
name:变量名 type:变量格式
还可以通过简短格式来实现
名字 :=表达式
需要注意的是,简短模式(short variable declaration)有以下限制:
- 定义变量,同时显式初始化。
- 不能提供数据类型。
- 只能用在函数内部
常量
Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。
const name [type] = value
const pi = 3.14159 // 相当于 math.Pi 的近似值
在Go语言中,你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。
package main
import (
"fmt"
//"math"
)
func main() {
var a = "initial"
var b, c int = 1, 2
var d = true
var e float32
f := float32(e)
fmt.Print(a, b, c, d, e, f)
const h = 100000
fmt.Print(h)
}
循环语法
与多数语言不同的是,Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C语言和 C++ 中非常接近:
for j := 0; j < 5; j++ {
for i := 0; i < 10; i++ {
if i > 5 {
break JLoop
}
fmt.Println(i)
}
}
JLoop:
// ...
其中可以利用break和continue跳出或者继续循环结构
switch
Go语言的 switch 要比C语言的更加通用,表达式不需要为常量,甚至不需要为整数,case 按照从上到下的顺序进行求值,直到找到匹配的项,如果 switch 没有表达式,则对 true 进行匹配,因此,可以将 if else-if else 改写成一个 switch。
Go语言改进了 switch 的语法设计,case 与 case 之间是独立的代码块,不需要通过 break 语句跳出当前 case 代码块以避免执行到下一行,示例代码如下:
var a = "hello"
switch a {
case "hello":
fmt.Println(1)
case "world":
fmt.Println(2)
default:
fmt.Println(0)
}
case 后不仅仅只是常量,还可以和 if 一样添加表达式
数组
var 数组变量名 [元素数量]Type
var a [5]int
语法说明如下所示:
- 数组变量名:数组声明及使用时的变量名。
- 元素数量:数组的元素数量,可以是一个表达式,但最终通过编译期计算的结果必须是整型数值,元素数量不能含有到运行时才能确认大小的数值。
- Type:可以是任意基本类型,包括数组本身,类型为数组本身时,可以实现多维数组。
切片
如果需要动态地创建一个切片,可以使用 make() 内建函数,格式如下:
make( []Type, size, cap )
make( []string, 3)
其中 Type 是指切片的元素类型,size 指的是为这个类型分配多少个元素,cap 为预分配的元素数量,这个值设定后不影响 size,只是能提前分配空间,降低多次分配空间造成的性能问题。
从数组或切片生成新的切片
切片默认指向一段连续内存区域,可以是数组,也可以是切片本身。
从连续内存区域生成切片是常见的操作,格式如下:
slice [开始位置 : 结束位置]
package main
import "fmt"
func main() {
s := make([]string, 4)
s[0] = "ji"
s[1] = "ni"
s[2] = "tai"
s[3] = "mei"
fmt.Println("get:", s[3])
var a = [3]int{1, 2, 3}
fmt.Println(a, a[1:2])
}
map
Go语言中 map 是一种特殊的数据结构,一种元素对(pair)的无序集合,pair 对应一个 key(索引)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,给定 key,就可以迅速找到对应的 value。
map 是引用类型,可以使用如下方式声明:
var mapname map[keytype]valuetype
其中:
- mapname 为 map 的变量名。
- keytype 为键类型。
- valuetype 是键对应的值类型。
提示:[keytype] 和 valuetype 之间允许有空格。
在声明的时候不需要知道 map 的长度,因为 map 是可以动态增长的,未初始化的 map 的值是 nil,使用函数 len() 可以获取 map 中 pair 的数目。
引用
Go语言入门教程,Golang入门教程(非常详细) (biancheng.net) the-way-to-go_ZH_CN/04.4.md at master · unknwon/the-way-to-go_ZH_CN · GitHub