基础语法

85 阅读7分钟

刚刚要上手,打个招呼——Hello, Golang!

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, Golang!")
}

在如上这段代码中,我们导入了fmt这个软件包,并使用了该软件包中的Println方法,实现文本的输入输出功能。

变量

在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)                // initialapple

	const s string = "constant"  //常量没有类型,会自己判断
	const h = 500000000
	const i = 3e20 / h
	fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}

注意,Go语言是静态类型语言,对于同一变量而言,变量一旦声明,其类型就不能改变。

循环——for

Go语言只提供了for循环用于重复执行一段代码,没有while。与C++区别为该语言循环判断语句不用加括号。 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
    }
}

判断——if-else

在Go语言中,if-else语句的语法如下:

if condition {
    // condition为真时执行的代码块
} else {
    // condition为假时执行的代码块
}

我们可以看到,condition部分并没有添加圆括号

例如:

if num := 9; num < 0 {  
fmt.Println(num, "is negative")  
} else if num < 10 {  
fmt.Println(num, "has 1 digit")  
} else {  
fmt.Println(num, "has multiple digits")  
}

switch语句

Go语言的switch语句用于根据表达式的值选择不同的执行路径,不用break。下面是switch语句的语法:


switch expression {
case value1:
    // 表达式等于value1时执行的代码块
case value2:
    // 表达式等于value2时执行的代码块
...
default:
    // 表达式不等于任何value时执行的代码块
}

例如:

t := time.Now()  
switch {  
case t.Hour() < 12:  
fmt.Println("It's before noon")  
default:  
fmt.Println("It's after noon")  
}

数组(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}

二维数组

var twoD [2][3]int  
for i := 0; i < 2; i++ {  //赋值
    for j := 0; j < 3; j++ {  
        twoD[i][j] = i + j  
}  

切片(Slice)

切片是对数组的一个连续片段的引用,它是动态大小的。切片提供了一种方便的方式来操作和管理数据。

以下是切片的基本语法:

var sliceName []Type

其中,sliceName是切片的名称,Type是切片元素的类型。例如:

var nums []int

上述代码声明了一个名为nums的切片,用于存储整数类型的元素。

切片可以通过数组或其他切片创建。可以使用切片操作符[:]从数组中创建切片。例如,假设有一个数组array

array := [5]int{1, 2, 3, 4, 5}
或者
array := make([]int, 5)  
array[0] = "1"  
array[1] = "2"  
array[2] = "3"
array[3] = "4"
array[4] = "5"

可以使用切片操作符从数组中创建切片:

array1 := array[1:4]  // 创建一个从索引1到索引3的切片

上述代码创建了一个名为array1的切片,它包含了数组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的元素。

切片是引用类型,当多个切片引用同一个底层数组时,它们会共享相同的数据。修改一个切片的元素会影响到其他引用同一底层数组的切片。

映射(Map)

映射是一种无序的键值对集合,也称为字典。它提供了一种便捷的方式来存储和检索数据,其中每个键都是唯一的。在Go语言中,映射使用map关键字声明。

以下是映射的基本语法:

var mapName map[KeyType]ValueType

其中,mapName是映射的名称,KeyType是键的类型,ValueType是值的类型。例如:

var m map[string]int

上述代码中,我们声明了一个名为m的映射,键的类型为string,值的类型为int

映射的创建可以使用make函数:

m := make(map[string]int)

上述代码中,我们创建了一个空的映射m,可以用于存储字符串键和整数值的对应关系。

可以使用方括号[]操作符来访问和修改映射中的值。例如,要设置映射中键"one"对应的值为1

m["one"] = 1

我们可以使用键来检索映射中的值:

fmt.Println(m) // map[one:1 two:2]

如果映射中不存在指定的键,则返回值类型的零值

想删除映射中的键值对时,我们可以使用内置的delete(delete(map, key))函数:

delete(m, "one")

上述代码将从映射one中删除键为"one"的键值对。

映射还提供了一个有用的特性,即可以通过多重赋值来检查映射中某个键是否存在。例如:


value, exists := m["one"]
if exists {
    fmt.Println("m1:", value)
} else {
    fmt.Println("m does not exist")
}

上述代码中,exists变量将被设置为truefalse,以指示键"one"是否存在于映射中。

映射是无序的,每次迭代映射的键值对顺序可能不同。可以使用range关键字迭代映射的键值对:

m2 := map[string]int{"one": 1, "two": 2}
for key, value := range m2 {
    fmt.Println(key, value)
}

上述代码将遍历映射m2中的键值对,并将键存储在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)
}