Go语言入门
环境配置
-
进入官网 go.dev/ ,点击Download,选择对应的硬件及系统进行安装
-
通过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语言,与它打交道。