Go 语言入门指南:Go语言中的语法糖| 青训营

178 阅读3分钟

1.什么是语法糖

语法糖是一种利用编程语言特性来简化代码的方式,它并不改变语言的功能或能力,但是可以使代码更加简洁、易读和易写。它是一种在语法层面上的改进,让代码的表达更加直观和方便。

Go中的语法糖

1.“...”操作符

...操作符常用来对不定长的数据进行处理,以下有几个例子:

在有的时候我们未必能够确定传入函数的实参的实际数量,此时我们就可以使用...操作符来进行操作,下面就是一个例子:

func func(a int, b ...int){
  return
}

在使用...的时候需要留意的是,必须将可以变长参数放置于函数形参列表中的最后一个,同时也需要注意可变长的参数会被当成切边进行解析,此处我在函数func中b就被当成了一个切片,如果可变参数没有值的时候,其就会被默认为一个nil切片

通过...,我们还可以声明不定长数组,具体的方法如下:

a := [...]int{111, 1//自动计算出数组的长度为4

此时如果我们需要对数组的某些特殊下标的元素进行操作,我们也可以使用如下代码

a := [...]int{1121000012}//这个代码中下表1的元素为12,下表100000的元素为12,其余均为0

此外...也可以用于结构体字段的赋值

type Person struct {
    Name    string
    Age     int
    Address string
}
person1 := Person{"Alice", 25, "123 Main St"}
person2 := Person{Name: "Bob", ...person1} // 将person1的字段值赋给person2

在切片初始化或切片操作时,可以使用...操作符将一个切片的元素快速扩展到另一个切片。例如: `

slice1 := []int{1, 2, 3}
slice2 := []int{4, 5}
slice3 := append(slice1, slice2...) // 将slice2的元素扩展到slice1中

在通道传输时,可以使用...操作符将一个切片的元素快速传输到通道中。具体实现如下所示

ch := make(chan int, 3)
slice := []int{1, 2, 3}
ch <- slice... // 将slice的元素传输到通道ch中

2.defer

在Go语言中,defer关键字用于延迟执行函数调用,可以在函数退出之前执行一些清理操作。

以下是一些示例:

  1. defer函数调用:使用defer关键字可以延迟执行函数调用,确保在函数退出时执行。例如:
func someFunction() {
    defer fmt.Println("Cleanup")
    fmt.Println("Do something")
}

someFunction()
// 输出:
// Do something
// Cleanup
  1. defer匿名函数:可以使用匿名函数和defer结合,实现在函数退出时执行一些复杂的清理操作。例如:
func someFunction() {
    defer func() {
        // 复杂的清理操作
        fmt.Println("Cleanup")
    }()
    fmt.Println("Do something")
}

someFunction()
// 输出:
// Do something
// Cleanup

3.Range

在Go语言中,range关键字用于迭代数组、切片、映射、字符串和通道等数据结构。

下面给出三个例子:

  1. 迭代数组和切片:可以使用range关键字迭代数组和切片的元素。例如:
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
    fmt.Println(index, value)
}
  1. 迭代映射:可以使用range关键字迭代映射的键值对。例如:
ages := map[string]int{
    "Alice": 25,
    "Bob":   30,
    "Carol": 35,
}
for name, age := range ages {
    fmt.Println(name, age)
}
  1. 迭代字符串:可以使用range关键字迭代字符串的Unicode字符。例如:
text := "Hello, 世界"
for index, char := range text {
    fmt.Println(index, char)
}

4.map

可以使用多重赋值的方式判断map中的键是否存在。例如:

ages := map[string]int{
    "Alice": 25,
    "Bob":   30,
    "Carol": 35,
}
if age, ok := ages["Alice"]; ok {
    fmt.Println("Alice's age is", age)
} else {
    fmt.Println("Alice's age is not found")
}