Go语言上手:Hello, Golang!|青训营

325 阅读8分钟

上回书说到,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的元素。

注意,此处的startIndexendIndex的其中一个可以不定义。若没有定义某个参数,则索引到给定数组的未定义的参数所在方向的边界。

切片还可以使用切片字面量来初始化:

slice := []int{1, 2, 3, 4, 5}

上述代码中,我们创建了一个名为slice的切片,包含了整数15的元素。

切片具有动态增长的能力,可以使用内置的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变量将被设置为truefalse,以指示键"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语言中有关各种变量的知识,欲学习更多知识,且听下回分解。