le"] = 10
myMap["banana"] = 5
myMap["apple"] = 15 // 更新键 "apple" 对应的值
访问和检查键值对
可以通过指定键来访问映射中的值。如果指定的键不存在,将返回值类型的零值。为了区分键不存在和值为零值两种情况,可以使用多返回值的方式来检查键是否存在。
value := myMap["apple"] // 访问键 "apple" 对应的值
// 检查键是否存在
value, exists := myMap["orange"]
if exists {
fmt.Println("The value for 'orange' is:", value)
} else {
fmt.Println("Key 'orange' does not exist.")
}
删除键值对
可以使用delete()
函数来删除映射中的键值对。如果指定的键不存在,delete()
函数不会产生错误。
delete(myMap, "banana") // 删除键 "banana" 对应的键值对
遍历映射
使用for range
循环可以遍历映射中的所有键值对。
for key, value := range myMap {
fmt.Println(key, value)
}
Go 中的映射是一个强大且方便的数据结构,它在许多场景下都非常有用,特别是用于表示键值对的集合。与 Python 中的字典类似,Go 的映射提供了快速的键值查找和更新,是处理键值对数据的理想选择。
结构体(Struct)
在Go语言中,结构体(Struct)是一种自定义的复合数据类型,它允许我们将不同类型的数据组合在一起,形成一个新的数据结构。结构体是由一系列字段(fields)组成,每个字段可以是不同的数据类型。结构体中的字段称为成员(members),它们表示结构体的特征和属性。
声明结构体
使用type
关键字来声明一个新的结构体类型。结构体的定义以关键字type
开头,后面紧跟结构体的名称,然后是一个由字段组成的花括号代码块。
type Person struct {
Name string
Age int
Height float64
}
创建结构体实例
通过声明一个结构体变量并为其成员赋值,我们可以创建结构体的实例。
// 创建一个Person结构体的实例
person1 := Person{
Name: "Alice",
Age: 30,
Height: 1.75,
}
访问结构体成员
可以使用.
运算符来访问结构体的成员。
fmt.Println(person1.Name) // 输出: "Alice"
fmt.Println(person1.Age) // 输出: 30
fmt.Println(person1.Height) // 输出: 1.75
结构体的匿名字段
结构体允许字段没有名称,这样的字段称为匿名字段。匿名字段的数据类型必须是命名的类型或具有命名的类型。
type Circle struct {
float64 // 匿名字段,代表圆的半径
}
嵌套结构体
结构体可以包含其他结构体作为其成员,这被称为嵌套结构体。通过嵌套结构体,我们可以建立更复杂的数据结构。
type Address struct {
City string
State string
}
type Person struct {
Name string
Age int
Address Address // 嵌套结构体作为成员
}
结构体的方法
结构体可以关联方法,通过这些方法可以为结构体类型添加行为。方法是特殊类型的函数,它们与结构体关联,可以在结构体实例上调用。
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
rect := Rectangle{Width: 10, Height: 5}
area := rect.Area() // 调用结构体的方法
在青训营课程中,使用了结构体来格式化 Request 和 Response 数据。
接口(Interface)
在Go语言中,接口(Interface)是一种抽象类型,它定义了一组方法的集合,但并不提供这些方法的具体实现。接口描述了对象的行为,而不关心对象的具体类型。任何类型只要实现了接口中定义的所有方法,就被认为是实现了该接口。
定义接口
使用type
关键字和interface
关键字来定义一个接口。接口的定义由一组方法签名组成,这些方法签名描述了接口中的方法。方法签名包括方法的名称、参数列表和返回值列表。
type Shape interface {
Area() float64
Perimeter() float64
}
实现接口
要实现一个接口,只需在类型上提供接口中定义的所有方法。实现接口不需要显式地声明实现了哪个接口,只要提供了接口中的方法,编译器会自动判断该类型实现了哪些接口。
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2*r.Width + 2*r.Height
}
多态性
接口的一个重要特性是多态性。多态性使得一个接口类型的变量可以在不同实现类型上调用相同的方法,实现了面向对象编程中的多态概念。
func printShapeInfo(s Shape) {
fmt.Println("Area:", s.Area())
fmt.Println("Perimeter:", s.Perimeter())
}
rect := Rectangle{Width: 5, Height: 3}
printShapeInfo(rect)
在上面的示例中,我们定义了一个Shape
接口,它有两个方法Area()
和Perimeter()
。然后我们创建了一个Rectangle
类型并为它实现了Shape
接口的方法。在printShapeInfo
函数中,我们接收一个Shape
接口类型的参数,并在不同类型的实现上调用了Area()
和Perimeter()
方法。这样,printShapeInfo
函数可以处理任何实现了Shape
接口的类型,实现了多态性。
通过接口,我们可以编写更灵活、可扩展的代码,因为接口将实现细节与接口的使用者解耦,允许我们对代码进行抽象和复用。
流程控制
条件语句
在Go语言中,条件语句主要包括if
、else
和switch
三种类型。它们用于根据不同条件执行不同的代码块。
if 语句
if
语句用于根据一个表达式的结果来执行相应的代码块。如果表达式的值为true
,则执行if
后的代码块;如果表达式的值为false
,则跳过if
后的代码块。
num := 10
if num &