Go学习笔记(一)| 青训营笔记

57 阅读5分钟

这是我参与第五届青训营办学笔记创作的第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

image.png

在终端输入

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])

}

image.png

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