(一)goroutine
package _case
import "fmt"
// sum 函数计算整数切片 values 的总和,并将结果发送到 resultChan 通道中
func sum(values []int, resultChan chan int) {
sum := 0
for _, value := range values {
sum += value
}
resultChan <- sum // 将计算结果发送到 channel 中
}
// ParacalcCase 函数演示并发计算,将整数切片分为两部分,并使用两个 goroutine 计算总和
func ParacalcCase() {
values := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
resultChan := make(chan int, 2) // 创建一个缓冲大小为 2 的整数通道
go sum(values[:len(values)/2], resultChan) // 启动一个 goroutine 计算切片的前半部分总和
go sum(values[len(values)/2:], resultChan) // 启动一个 goroutine 计算切片的后半部分总和
sum1, sum2 := <-resultChan, <-resultChan // 从通道中接收两个计算结果
fmt.Println("Result:", sum1, sum2, sum1+sum2) // 打印计算的结果
} // paracalcCase
在这段代码中,实现了并发计算的功能。主要内容如下:
-
定义函数
sum
- 函数
sum
接受一个整数切片values
和一个整数类型的通道resultChan
。 - 遍历整数切片
values
,计算总和,并将结果发送到通道resultChan
中。
- 函数
-
函数
ParacalcCase
- 创建一个整数切片
values
包含了从1到10的整数。 - 创建一个缓冲大小为2的整数通道
resultChan
。 - 启动两个 goroutine 分别计算切片的前半部分和后半部分的总和,并将结果发送到通道
resultChan
中。 - 从通道中接收两个计算结果,并将结果打印出来。
- 创建一个整数切片
涉及的知识点
并发编程
- 使用 goroutine 实现并发计算,提高程序的执行效率。
通道(Channel)
- 使用通道来进行 goroutine 之间的通信。通道是 goroutine 之间通信的一种方式,可以安全地在不同 goroutine 之间传递数据。
切片(Slice)
- 使用切片来存储整数数据,并根据切片的长度划分数据进行并发计算。
函数
- 定义和调用了带有参数和返回值的函数,实现了业务逻辑。
并发编程
- 利用 Go 语言的并发特性,使用 goroutine 实现并发计算,加快数据处理速度。
通道通信
- 使用通道进行 goroutine 之间的数据传递,实现并发计算结果的汇总。
(二)reflect
package _case
import (
"fmt"
"reflect"
)
// 定义结构体 Animal 包含名称和寿命
type Animal struct {
Name string
LifeExpectancy int
}
// 定义 Animal 结构体的方法 Run,用于输出动物可以奔跑的信息
func (a *Animal) Run() {
fmt.Println("I can run")
}
// ReflectCase 函数演示了如何使用反射功能来获取结构体实例的字段值
func ReflectCase() {
// 创建一个名为 Jerry 寿命为 3 的 Animal 实例
jerry := &Animal{"Jerry", 3}
j := reflect.ValueOf(jerry).Elem() // 通过反射获取实例的值
typeOfT := j.Type() // 获取实例的类型信息
for i := 0; i < j.NumField(); i++ {
f := j.Field(i) // 获取实例的字段值
// 输出字段索引、字段名称、字段类型及字段值
fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(),
f.Interface())
}
}
这段代码中定义了一个 Animal
结构体,包含了动物的名称和预期寿命,并实现了 Run
方法用于输出动物奔跑的信息。在 ReflectCase
函数中,通过使用反射(reflect)功能,演示了如何获取结构体实例的字段值并打印出字段的索引、名称、类型和值。反射是一种强大的工具,可以在运行时检查变量、变量的类型,并操作值和类型。如果有任何问题或需要进一步的解释,请随时告诉我。
使用到的知识点和语法:
-
结构体 (Struct):定义结构体来表示具有一组相关字段的自定义数据类型。
-
方法 (Method):在结构体上定义方法,使得结构体实例能够执行特定的行为。
-
反射 (Reflection):通过
reflect
包中的函数实现反射,可以在运行时检查类型、值和调用对应的方法等功能。 -
reflect.ValueOf:返回一个
reflect.Value
,该值包含传入参数的值。可以通过.Elem()
方法获取实际的值。 -
reflect.Type:通过
reflect.Value
的Type()
方法获取值对应的类型信息。 -
reflect.Field:使用
Field()
方法获取结构体的字段值,并对其进行操作。 -
fmt.Printf:格式化输出,用于输出格式化的字符串,包括参数的索引、字段名称、类型和值等。
这些知识点和语法在代码中被使用,结合起来实现了对结构体实例的反射操作,获取并输出字段的信息。反射在编程中是一种高级的技术,允许程序在运行时动态地检查类型信息、获取字段值等,对于一些元编程和动态特性的场景非常有用。