Función reflect.UnsafeAddr() 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.UnsafeAddr() en Golang se usa para obtener el puntero a los datos de v. Para acceder a esta función, es necesario importar el paquete reflect en el programa.
 

Sintaxis:  

func (v Value) UnsafeAddr() uintptr

Parámetros: Esta función no acepta ningún parámetro.
Valor de retorno: esta función devuelve el puntero a los datos de v.  

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

C

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

Producción:  

42
42

Ejemplo 2:

C

// Golang program to illustrate
// reflect.UnsafeAddr() Function
   
package main
   
import (
    "fmt"
    "reflect"
    "unsafe"
)
   
// Main function
func main() {
    var s = struct{ foo int }{374}
    var i int
 
    rs := reflect.ValueOf(s)
 
    rf := rs.Field(0)
     
    rs2 := reflect.New(rs.Type()).Elem()
    rs2.Set(rs)
    rf = rs2.Field(0)
    rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
     
    ri := reflect.ValueOf(&i).Elem() // i, but writable
    ri.Set(rf)
     
    fmt.Println(rf)
    fmt.Println(ri)
     
}

Producción: 

374
374

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 *