Golang reflect.Select()函数及示例
Go 语言提供了运行时反射的内置支持,并通过反射包允许程序操作具有任意类型的对象。Golang 中的 reflect.Select() 方法用于执行由 case 列表描述的选择操作。要访问此函数,需要在程序中导入 reflect 包。
语法:
func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
参数: 此函数接受以下参数:
- cases: 这个参数是 case 列表。
返回值: 此函数返回所选 case 的索引。
以下示例演示了如何在 Golang 中使用上述方法:
示例 1:
// Golang 程序示例
// 说明 reflect.Select() 方法
package main
import (
"fmt"
"reflect"
)
func main() {
c := make(chan int, 1)
vc := reflect.ValueOf(c)
succeeded := vc.TrySend(reflect.ValueOf(123))
fmt.Println(succeeded, vc.Len(), vc.Cap())
vSend, vZero := reflect.ValueOf(789), reflect.Value{}
branches := []reflect.SelectCase{
{Dir: reflect.SelectDefault, Chan: vZero, Send: vZero},
{Dir: reflect.SelectRecv, Chan: vc, Send: vZero},
{Dir: reflect.SelectSend, Chan: vc, Send: vSend},
}
// 使用 Select() 方法
selIndex, vRecv, sentBeforeClosed := reflect.Select(branches)
fmt.Println(selIndex)
fmt.Println(sentBeforeClosed)
fmt.Println(vRecv.Int())
vc.Close()
// 这次删除发送案例分支
// 因为它可能引发恐慌。
selIndex, _, sentBeforeClosed = reflect.Select(branches[:2])
fmt.Println(selIndex, sentBeforeClosed)
} ```
输出:
true 1 1
1
true
123
1 false
示例 2:
// Golang 程序示例
// 说明 reflect.Select() 方法
package main
import (
"fmt"
"reflect"
)
func main() {
var sendCh = make(chan int)
var increaseInt = func(c chan int) {
for i := 0; i < 8; i++ {
c <- i
}
close(c)
}
go increaseInt(sendCh)
var selectCase = make([]reflect.SelectCase, 1)
selectCase[0].Dir = reflect.SelectRecv
selectCase[0].Chan = reflect.ValueOf(sendCh)
counter := 0
for counter < 1 {
// 使用 Select() 方法
chosen, recv, recvOk := reflect.Select(selectCase)
if recvOk {
fmt.Println(chosen, recv.Int(), recvOk)
} else {
counter++
}
}
}
输出:
0 0 true
0 1 true
0 2 true
0 3 true
0 4 true
0 5 true
0 6 true
0 7 true