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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。