Función reflect.Select() en Golang con ejemplos

El lenguaje Go proporciona una implementación de soporte incorporada de la reflexión en tiempo de ejecución y permite que un programa manipule objetos con tipos arbitrarios con la ayuda del paquete de reflexión. La función reflect.Select() en Golang se usa para ejecutar una operación de selección descrita por la lista de casos. Para acceder a esta función, es necesario importar el paquete reflect en el programa.

Sintaxis:

func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)

Parámetros: Esta función toma los siguientes parámetros:

  • cases : Este parámetro es la lista de casos.

Valor devuelto: Esta función devuelve el índice del caso elegido.

Los siguientes ejemplos ilustran el uso del método anterior en Golang:

Ejemplo 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) 
}        

Producción:

true 1 1
1
true
123
1 false

Ejemplo 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++
         }
     }
 }

Producción:

0 0 true
0 1 true
0 2 true
0 3 true
0 4 true
0 5 true
0 6 true
0 7 true

Publicación traducida automáticamente

Artículo escrito por SHUBHAMSINGH10 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *