上回书说到,Go语言有很多优势,同时介绍了可供选择的几款优秀的IDE,那么从本节开始,将正式进入Go语言的学习阶段。
Hello, Golang!
Hello World!
是每一位程序员梦的起点,接下来,我们将通过一段简单的代码来实现使用Go语言打印Hello, Golang!
内容。
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, Golang!")
}
在如上这段代码中,我们导入了fmt
这个软件包,并使用了该软件包中的Println
方法,该方法的作用是将给定的参数以文本的形式打印到控制台。不同于其他大部分语言,在Go语言中,我们需要进行导入软件包的操作才可以调用函数以打印到控制台。
以上便是我们在控制台打印内容一段示例代码,下面,我们学习Go语言的基本语法。
变量
在Go语言中,我们可以使用关键字var
来声明变量。变量声明的一般语法是:var 变量名 类型
。例如,声明一个整数变量可以使用var num int
。
当我们在声明多个同一类型的变量时,我们可以串联起来,例如var b, c int = 1, 2
,这样可以极大的缩减代码量,使代码更加简洁。
我们还可以使用:=
来进行变量的简短声明和赋值,例如num := 10
,这样的声明方式可以实现对变量类型的自推断。
以下是一段简单的示例:
package main
import (
"fmt"
"math"
)
func main() {
var a = "initial"
var b, c int = 1, 2 //这是一个串联声明多个变量的实例
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialfoo
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
注意,Go语言是静态类型语言,对于同一变量而言,变量一旦声明,其类型就不能改变。
if-else语句
在Go语言中,if-else语句的语法如下:
if condition {
// condition为真时执行的代码块
} else {
// condition为假时执行的代码块
}
我们可以看到,condition
部分并没有添加圆括号,这一点与Java等语言的强制性要求有所不同。
例如:
age := 18
if age >= 18 {
fmt.Println("成年人")
} else {
fmt.Println("未成年人")
}
循环
Go语言提供了for
循环用于重复执行一段代码。for
循环有三种形式:基本的for
循环、for
循环的变种for range
和无限循环for
。下面是这三种形式的示例:
- 基本的
for
循环:
for 初始化语句; 循环条件; 后续语句 {
// 循环体
}
例如:
for i := 0; i < 5; i++ {
fmt.Println(i)
}
for range
循环:for range
循环用于遍历数组、切片、字符串、映射等数据结构。
for index, value := range collection {
// 循环体
}
例如:
nums := []int{1, 2, 3, 4, 5}
for index, value := range nums {
fmt.Println(index, value)
}
- 无限循环:
for
循环的条件部分可以省略,这将导致无限循环。可以使用break
语句来跳出循环。
for {
// 循环体
if condition {
break
}
}
switch语句
Go语言的switch
语句用于根据表达式的值选择不同的执行路径。switch
语句可以与if-else
语句相比更加简洁。下面是switch
语句的语法:
switch expression {
case value1:
// 表达式等于value1时执行的代码块
case value2:
// 表达式等于value2时执行的代码块
...
default:
// 表达式不等于任何value时执行的代码块
}
例如:
day := 3
switch day {
case 1:
fmt.Println("星期一")
case 2:
fmt.Println("星期二")
case 3:
fmt.Println("星期三")
default:
fmt.Println("其他")
}
数组(Array)
数组是一种固定长度且具有相同类型元素的数据结构。在Go语言中,可以使用以下语法声明一个数组:
var arrayName [length]Type
其中,arrayName
是数组的名称,length
是数组的长度,Type
是数组元素的类型。例如:
var nums [5]int
可以使用索引来访问数组元素,索引从0开始。例如:
nums[0] = 1
nums[1] = 2
还可以使用数组字面量来初始化数组:
nums := [5]int{1, 2, 3, 4, 5}
切片(Slice)
切片是对数组的一个连续片段的引用,它是动态大小的。切片提供了一种方便的方式来操作和管理数据。
以下是切片的基本语法:
var sliceName []Type
其中,sliceName
是切片的名称,Type
是切片元素的类型。例如:
var nums []int
上述代码声明了一个名为nums
的切片,用于存储整数类型的元素。
切片可以通过数组或其他切片创建。可以使用切片操作符[:]
从数组中创建切片。例如,假设有一个数组array
:
array := [5]int{1, 2, 3, 4, 5}
可以使用切片操作符从数组中创建切片:
slice := array[1:4] // 创建一个从索引1到索引3的切片
上述代码创建了一个名为slice
的切片,它包含了数组array
中索引1到索引3的元素。
注意,此处的startIndex
和endIndex
的其中一个可以不定义。若没有定义某个参数,则索引到给定数组的未定义的参数所在方向的边界。
切片还可以使用切片字面量来初始化:
slice := []int{1, 2, 3, 4, 5}
上述代码中,我们创建了一个名为slice
的切片,包含了整数1
到5
的元素。
切片具有动态增长的能力,可以使用内置的append
函数向切片中添加元素。例如:
slice := []int{1, 2, 3, 4, 5}
slice = append(slice, 6)
上述代码中,实现了将整数6
追加到切片slice
的末尾。
切片还有一些有用的属性和方法。可以使用len
函数获取切片的长度:
length := len(slice)
可以使用cap
函数获取切片的容量:
capacity := cap(slice)
切片的容量是指底层数组中可用于切片的元素个数。
切片还支持切片操作,可以通过指定起始索引和结束索引来获取切片的子切片。例如:
slice := []int{1, 2, 3, 4, 5}
subSlice := slice[1:3] // 获取从索引1到索引2的子切片
上述代码将创建一个名为subSlice
的切片,包含了切片slice
中索引1到索引2的元素。
切片是引用类型,当多个切片引用同一个底层数组时,它们会共享相同的数据。修改一个切片的元素会影响到其他引用同一底层数组的切片。
切片是Go语言中非常重要和常用的数据结构,它提供了灵活和高效的数据操作方式。
映射(Map)
映射是一种无序的键值对集合,也称为字典。它提供了一种便捷的方式来存储和检索数据,其中每个键都是唯一的。在Go语言中,映射使用map
关键字声明。
以下是映射的基本语法:
var mapName map[KeyType]ValueType
其中,mapName
是映射的名称,KeyType
是键的类型,ValueType
是值的类型。例如:
var scores map[string]int
上述代码中,我们声明了一个名为scores
的映射,键的类型为string
,值的类型为int
。
映射的创建可以使用make
函数:
scores := make(map[string]int)
上述代码中,我们创建了一个空的映射scores
,可以用于存储字符串键和整数值的对应关系。
可以使用方括号[]
操作符来访问和修改映射中的值。例如,要设置映射中键"Alice"
对应的值为90
:
scores["Alice"] = 90
我们可以使用键来检索映射中的值:
fmt.Println(scores["Alice"]) // 输出:90
如果映射中不存在指定的键,则返回值类型的零值。
想删除映射中的键值对时,我们可以使用内置的delete
函数:
delete(scores, "Alice")
上述代码将从映射scores
中删除键为"Alice"
的键值对。
映射还提供了一个有用的特性,即可以通过多重赋值来检查映射中某个键是否存在。例如:
value, exists := scores["Alice"]
if exists {
fmt.Println("Alice's score:", value)
} else {
fmt.Println("Alice's score does not exist")
}
上述代码中,exists
变量将被设置为true
或false
,以指示键"Alice"
是否存在于映射中。
映射是无序的,每次迭代映射的键值对顺序可能不同。可以使用range
关键字迭代映射的键值对:
scores := map[string]int{"Alice": 90, "Bob": 80, "Charlie": 70}
for key, value := range scores {
fmt.Println(key, value)
}
上述代码将遍历映射scores
中的键值对,并将键存储在key
变量中,将值存储在value
变量中。
映射是一种非常有用的数据结构,可以用于解决各种问题,例如存储配置信息、缓存数据、实现关联数组等。
range
range
关键字用于迭代数组、切片、映射或字符串。它返回索引和对应的值。例如:
nums := []int{1, 2, 3, 4, 5}
for index, value := range nums {
fmt.Println(index, value)
}
还可以使用range
迭代映射的键值对:
scores := map[string]int{"Alice": 90, "Bob": 80, "Charlie": 70}
for key, value := range scores {
fmt.Println(key, value)
}
本回中,我们介绍的更多是Go语言中有关各种变量的知识,欲学习更多知识,且听下回分解。