Go语言入门式学习 | 青训营笔记

75 阅读4分钟

Go语言入门

环境配置

  1. 进入官网 go.dev/ ,点击Download,选择对应的硬件及系统进行安装

  2. 通过homebrew安装

$brew install go

基本语法

基本框架

package main  
  
import "fmt"  
  
func main() {  
    fmt.Println("Hello World!")  
}

变量类型

在Go语言中,变量是强类型而非弱类型,意味着我们需要在声明变量时确定变量类型

使用var给声明变量

var a = "114514"  //字符串
var b, c = 1919, 810  //整型
var d = true  //布尔型

这种方式会自动推导变量类型,亦可显式给定变量类型,如

var a int = 114514

另一种声明变量的方式是使用 :=

a := 114514

常量

常量的声明就是把var改成const Go语言里面的常量是无类型的,没有确定的类型,而是根据上下文自动确定类型。

const a = 1145141919810

无类型的一大优势就是可以摆脱数据类型的限制,从而进行更精确的大数运算

选择分支

if else 结构

if 7%2 == 0 {  
    fmt.Println("7 is even")  
} else {  
    fmt.Println("7 is odd")  
}  
  

if和else后面的条件不需要加括号,条件后必须接大括号,且else要接在 } 同一行的后方

switch结构

j := 2  
switch j {  
case 1:  
    fmt.Println("one")  
case 2:  
    fmt.Println("two")  
case 3:  
    fmt.Println("three")  
}  

switch 后无需加括号,case后的语句无需加break,Go语言为此隐性自带break效果

循环

for i := 1; i < 10; i++ {  
    fmt.Println(i)  
}  
i := 1  
for i <= 3 {  
    fmt.Println(i)  
    i = i + 1  
}

在Go语言中没有while与do…while结构,for循环可以与c语言for循环的三段式风格一致,也可以只写一段条件表达式,类似while循环

数组

var l [5]int  
l[4] = 100  
fmt.Println(l, len(l))  
  
m := [5]int{1, 2, 3, 4, 5}  
fmt.Println(m)

数组是一个具有编号且长度确定的数字序列,与C语言相近。由于长度不可变,因而实际代码中常使用长度可变的切片而非数组

切片slice

声明切片

o := make([]int, 3)

修改与添加元素

o[0] = 1  
o[1] = 1  
o[2] = 4  
o = append(o, 5)  
o = append(o, 1)  
o = append(o, 4)

切片的逻辑结构与物理结构类似于数据结构中的顺序表,存储了一个长度和一个指针,指针指向内存上连续的数组。在添加元素时,如果连续的内存不足,需要进行扩容,这时原数组的指针就会发生变化,因而添加元素后需要再赋值

获取一个区间的元素

fmt.Println(q[1:4])  
fmt.Println(q[:4])  
fmt.Println(q[1:])

区间是左开右闭的

哈希表 map

map是Go语言的新特性,可以借此实现哈希表

声明变量

r := make(map[string]int)  

元素操作

r["one"] = 1  
r["two"] = 2  
r["three"] = 3  
fmt.Println(r) //无序,随机顺序输出  
fmt.Println(len(r))

譬如r["one"] = 1 ,当r原本没有键为“one”,则创建一个键值对“one”:1 map中的元素是无序的

range

对于一个slice或map可以用range对其进行迭代,range遍历时,对数组返回两个值,分别是索引与值,对哈希表返回键和值。当然,哈希表的遍历顺序是随机的

t1 := [6]int{1, 1, 4, 5, 1, 4}  
t2 := map[string]int{"one": 1, "two": 2, "three": 3}  
for i, v := range t1 {  
    fmt.Println(i, v)  
}  
for k, v := range t2 {  
    fmt.Println(k, v)  
}

指针

Go语言的指针,相比于C与C++,功能受到了很大限制,主要用于对传入参数值的改变

func swap(a int, b int) {  
    a, b = b, a  
}  
  
func swap_real(a *int, b *int) {  
    *a, *b = *b, *a  
}

u1 := 114  
u2 := 514  
fmt.Println(u1, u2)  
swap(u1, u2)         //不改变实参
fmt.Println(u1, u2)  
swap_real(&u1, &u2)  //改变实参
fmt.Println(u1, u2)

总结感悟

我曾与C++和Python语言打过交道,通过了解Go语言,我认识到这是一个结合了Python与C++一些优点的新兴语言,它既有C++的数组、变量强类型、选择分支与循环结构,还结合了Python的切片、字典,较C++更高效,较Python更高性能。 我很喜欢这门Go语言,初步了解它,我很高兴。希望在今后我可以更深入地学习Go语言,与它打交道。