Go语言提供了运行时反射的内置支持实现,并允许程序借助反射包来操纵任意类型的对象。 Golang中的reflect.Select()函数用于执行病例列表所描述的选择操作。要访问此函数,需要在程序中导入反射包。
用法:
func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
参数:此函数采用以下参数:
- cases:此参数是案例列表。
返回值:此函数返回所选案例的索引。
以下示例说明了以上方法在Golang中的用法:
范例1:
// Golang program to illustrate
// reflect.Select() Function
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},
}
// use of Select() method
selIndex, vRecv, sentBeforeClosed:= reflect.Select(branches)
fmt.Println(selIndex)
fmt.Println(sentBeforeClosed)
fmt.Println(vRecv.Int())
vc.Close()
// Remove the send case branch this time,
// for it may cause panic.
selIndex, _, sentBeforeClosed = reflect.Select(branches[:2])
fmt.Println(selIndex, sentBeforeClosed)
}
输出:
true 1 1 1 true 123 1 false
范例2:
// Golang program to illustrate
// reflect.Select() Function
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 {
// use of Select() method
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
相关用法
- Golang math.Lgamma()用法及代码示例
- Golang math.Float64bits()用法及代码示例
- Golang atomic.AddInt64()用法及代码示例
- Golang atomic.StoreInt64()用法及代码示例
- Golang reflect.FieldByIndex()用法及代码示例
- Golang string.Contains用法及代码示例
- Golang bits.Sub()用法及代码示例
- Golang io.PipeWriter.CloseWithError()用法及代码示例
- Golang time.Round()用法及代码示例
- Golang reflect.AppendSlice()用法及代码示例
- Golang reflect.ChanOf()用法及代码示例
- Golang flag.Bool()用法及代码示例
- Golang time.Sleep()用法及代码示例
- Golang time.Time.Year()用法及代码示例
- Golang reflect.DeepEqual()用法及代码示例
- Golang reflect.Indirect()用法及代码示例
- Golang reflect.CanAddr()用法及代码示例
- Golang reflect.CanInterface()用法及代码示例
- Golang reflect.CanSet()用法及代码示例
- Golang reflect.Cap()用法及代码示例
注:本文由纯净天空筛选整理自SHUBHAMSINGH10大神的英文原创作品 reflect.Select() Function in Golang with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。