一个菜鸡的GO入门笔记(一)| 青训营

55 阅读3分钟

Go语言入门(一)

Hello world

package main  //声明了 main.go 所在的包,Go 语言中使用包来组织代码。一般一个文件夹即一个包,包内可以暴露类型或方法供其他包使用。  
import "fmt"  // fmt 是 Go 语言的一个标准库/包,用来处理标准输入输出。  
func main() {  
fmt.Println("Hello, 世界")  //调用 fmt 包的 Println 方法,打印出 “Hello World!”  
}  //main 函数是整个程序的入口,main 函数所在的包名也必须为 main。

变量与内置数据类型

变量(Variable)

Go语言的变量声明的标准格式为:

var 变量名 变量类型

变量声明以关键字 var 开头,后置变量类型,行尾无须分号。

var a int // 如果没有赋值,默认为0
var a int = 1 // 声明时赋值 
var a = 1 // 声明时赋值

基本数值类型

var a int8 = 10 //整型类型: int(取决于操作系统), int8, int16, int32, int64, uint8, uint16, …  
var c1 byte = 'a' //字节类型:byte (等价于uint8)  
var b float32 = 12.2 //浮点数类型:float32, float64  
var msg = "Hello World" //字符串类型:string  
ok := false //布尔值类型:boolean,(true 或 false)

image.png

字符串

package main  
  
import (  
"fmt"  
"reflect"  
)  
  
func main() {  
str1 := "Golang" //简短声明  
str2 := "Go语言" //简短声明  
fmt.Println(reflect.TypeOf(str2[2]).Kind()) //uint8  
fmt.Println(str1[2], string(str1[2])) // 108 l  
//字符串是以 byte 数组形式保存的,类型是 uint8,占1个 byte,打印时需要用 string 进行类型转换,否则打印的是编码值  
fmt.Printf("%d %c\n", str2[2], str2[2]) // 232 è  
//因为字符串是以 byte 数组的形式存储的,所以,str2[2] 的值并不等于语。  
fmt.Println("len(str2):", len(str2)) // len(str2): 8  
//str2 的长度 len(str2) 也不是 4,而是 8( Go 占 2 byte,语言占 6 byte)。  
}

注: reflect.TypeOf().Kind() 可以知道某个变量的类型

正确的处理方式是将 string 转为 rune 数组

str2 := "Go语言"
runeArr := []rune(str2)
fmt.Println(reflect.TypeOf(runeArr[2]).Kind()) // int32
fmt.Println(runeArr[2], string(runeArr[2]))    // 35821 语
fmt.Println("len(runeArr):", len(runeArr))    // len(runeArr):

转换成 []rune 类型后,字符串中的每个字符,无论占多少个字节都用 int32 来表示,因而可以正确处理中文。

数组(array)与切片(slice)

声明数组

var arr [5]int     // 一维
var arr2 [5][5]int // 二维 

声明时初始化

var arr = [5]int{1, 2, 3, 4, 5}
// 或 arr := [5]int{1, 2, 3, 4, 5}

使用 [] 索引/修改数组

arr := [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(arr); i++ {
	arr[i] += 100
}
fmt.Println(arr)  // [101 102 103 104 105]

声明切片

slice1 := make([]float32, 0) // 长度为0的切片
slice2 := make([]float32, 3, 5) // [0 0 0] 长度为3容量为5的切片
fmt.Println(len(slice2), cap(slice2)) // 3 5

使用切片

// 添加元素,切片容量可以根据需要自动扩展
slice2 = append(slice2, 1, 2, 3, 4) // [0, 0, 0, 1, 2, 3, 4]
fmt.Println(len(slice2), cap(slice2)) // 7 12
// 子切片 [start, end)
sub1 := slice2[3:] // [1 2 3 4]
sub2 := slice2[:3] // [0 0 0]
sub3 := slice2[1:4] // [0 0 1]
// 合并切片
combined := append(sub1, sub2...) // [1, 2, 3, 4, 0, 0, 0]

字典

image.png

指针(pointer)

指针即某个值的地址,类型定义时使用符号*,对一个已经存在的变量,使用 & 获取该变量的地址。

image.png

流程控制(if, for, switch)

if else

image.png

switch

image.png 和其他语言不同的地方在于,Go 语言的 switch 不需要 break,匹配到某个 case,执行完该 case 定义的行为后,默认不会继续往下执行。 如果需要继续往下执行,需要使用 fallthrough。

image.png

for 循环

image.png 对数组(arr)、切片(slice)、字典(map) 使用 for range 遍历:

image.png

函数(functions)

image.png