go语言编程 小试牛刀 goroutine和reflect知识点

avatar
作者
筋斗云
阅读量:6

(一)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

 

在这段代码中,实现了并发计算的功能。主要内容如下:

  1. 定义函数 sum

    • 函数 sum 接受一个整数切片 values 和一个整数类型的通道 resultChan
    • 遍历整数切片 values,计算总和,并将结果发送到通道 resultChan 中。
  2. 函数 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)功能,演示了如何获取结构体实例的字段值并打印出字段的索引、名称、类型和值。反射是一种强大的工具,可以在运行时检查变量、变量的类型,并操作值和类型。如果有任何问题或需要进一步的解释,请随时告诉我。

使用到的知识点和语法:

  1. 结构体 (Struct):定义结构体来表示具有一组相关字段的自定义数据类型。

  2. 方法 (Method):在结构体上定义方法,使得结构体实例能够执行特定的行为。

  3. 反射 (Reflection):通过 reflect 包中的函数实现反射,可以在运行时检查类型、值和调用对应的方法等功能。

  4. reflect.ValueOf:返回一个 reflect.Value,该值包含传入参数的值。可以通过 .Elem() 方法获取实际的值。

  5. reflect.Type:通过 reflect.ValueType() 方法获取值对应的类型信息。

  6. reflect.Field:使用 Field() 方法获取结构体的字段值,并对其进行操作。

  7. fmt.Printf:格式化输出,用于输出格式化的字符串,包括参数的索引、字段名称、类型和值等。

这些知识点和语法在代码中被使用,结合起来实现了对结构体实例的反射操作,获取并输出字段的信息。反射在编程中是一种高级的技术,允许程序在运行时动态地检查类型信息、获取字段值等,对于一些元编程和动态特性的场景非常有用。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!