Función reflect.NewAt() 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.NewAt() en Golang se usa para obtener el valor que representa un puntero a un valor del tipo especificado, usando p como ese puntero. Para acceder a esta función, es necesario importar el paquete reflect en el programa.

Sintaxis:

func NewAt(typ Type, p unsafe.Pointer) Value

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

  • typ : Este parámetro es el Tipo.
  • p : este parámetro es unsafe.Pointer.

Valor de retorno: esta función devuelve un valor que representa un puntero a un valor del tipo especificado.

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

Ejemplo 1:

// Golang program to illustrate
// reflect.NewAt() Function 
  
package main
  
import (
    "reflect"
    "unsafe"
    "fmt"
)
  
func main() {
    var s = struct{ foo int }{100}
    var i int
  
    rs := reflect.ValueOf(&s).Elem() 
    rf := rs.Field(0)              
    ri := reflect.ValueOf(&i).Elem()
      
    // use of NewAt() method
    rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
    ri.Set(rf)
    rf.Set(ri)
      
    fmt.Println(rf)
}

Producción:

100

Ejemplo 2:

// Golang program to illustrate
// reflect.NewAt() Function 
  
package main
  
import (
    "fmt"
    "play.ground/foo"
    "reflect"
    "unsafe"
)
  
func GetUnexportedField(field reflect.Value) interface{} {
    return reflect.NewAt(field.Type(), 
      unsafe.Pointer(field.UnsafeAddr())).Elem().Interface()
}
  
func SetUnexportedField(field reflect.Value, value interface{}) {
    reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).
        Elem().
        Set(reflect.ValueOf(value))
}
  
func main() {
    f := &foo.Foo{
        Exported: "Old Value ",
    }
  
    fmt.Println(f.Exported) 
      
    field := reflect.ValueOf(f).Elem().FieldByName("unexported")
    SetUnexportedField(field, "New Value")
    fmt.Println(GetUnexportedField(field))
}
  
-- go.mod --
module play.ground
  
-- foo/foo.go --
package foo
  
type Foo struct {
    Exported   string
    unexported string
}

Producción:

Old Value 
New Value

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 *