go语言编程 小试牛刀 goroutine和reflect知识点
创始人
2024-12-27 06:35:08
0

(一)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:格式化输出,用于输出格式化的字符串,包括参数的索引、字段名称、类型和值等。

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

相关内容

热门资讯

玩家必看科普!皮皮衡阳字牌科技... 玩家必看科普!皮皮衡阳字牌科技,新星游辅助怎么购买,原本有开挂辅助安装(确实有挂);打开点击测试直接...
透视透明!新道游房间,微乐小程... 透视透明!新道游房间,微乐小程序辅助脚本平台(扑克教程!开挂辅助神器);打开点击测试直接进入微信(1...
科技介绍!赣牌圈科技有没有挂,... 大家好,今天小编来为大家解答越乡游义乌辅助器微信免费这个问题咨询软件客服可以免费测试直接加微信(13...
来一盘!红茶楼互娱辅助,来趣广... >>您好:红茶楼互娱辅助确实是有挂的,很多玩家在这款红茶楼互娱辅助游戏中打牌都会发现很多用户的牌特别...
透明神器!wepoker透视最... 透明神器!wepoker透视最简单三个步骤,微信微乐辅助器使用教程(曝光教程辅助开挂下载);无需打开...
六分钟了解!杭州都莱可以装挂吗... 蜀山四川智能辅助插件是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可以加...
玩家交流!闲来辅助最新版下载,... 闲来辅助最新版下载开挂教程视频分享装挂详细步骤在当今的网络游戏中,闲来辅助最新版下载作为一种经典的娱...
透视规律!微乐小程序免费黑科技... 透视规律!微乐小程序免费黑科技,wepoker能不能透视(攻略方法辅助平台)1、下载安装好微乐小程序...
必知教程!灯笼众娱脚本,潮汕激... 您好:这款灯笼众娱脚本游戏是可以开挂的,确实是有挂的,很多玩家在这款灯笼众娱脚本游戏中打牌都会发现很...
记者发布!微信微乐小程序修改器... 记者发布!微信微乐小程序修改器,微友助手app下载辅助器,原生有开挂辅助下载(有挂猫腻)1、下载安装...