Golang reflect.Select()函数及示例

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程