Función atomic.StorePointer() en Golang con ejemplos

En el lenguaje Go, los paquetes atómicos proporcionan una memoria atómica de nivel inferior que es útil para implementar algoritmos de sincronización. La función StorePointer() en el lenguaje Go se usa para almacenar atómicamente val en *addr . Esta función se define en el paquete atómico. Aquí, debe importar el paquete «sync/atomic» para usar estas funciones.

Sintaxis:

func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)

Aquí, addr indica dirección.

Nota: (*unsafe.Pointer) es el puntero a un valor de unsafe.Pointer. Y unsafe.Pointer type es útil para permitir transiciones entre tipos arbitrarios y el tipo uintptr integrado . Además, unsafe es un paquete que es útil en la seguridad de tipo de los programas Go.

Valor de retorno: almacena el valor en *addr y luego se puede devolver cuando sea necesario.

Ejemplo 1:

// Program to illustrate the usage of
// StorePointer function in Golang
  
// Including main package
package main
  
// importing fmt, 
// sync/atomic and unsafe
import (
    "fmt"
    "sync/atomic"
    "unsafe"
)
  
// Defining a struct type L
type L struct{ x, y, z int }
  
// Declaring pointer 
// to L struct type
var PL *L
  
// Calling main
func main() {
  
    // Defining *addr unsafe.Pointer
    var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL))
  
    // Defining value 
    // of unsafe.Pointer
    var px L
  
    // Calling StorePointer and 
    // storing unsafe.Pointer
    // value to *addr
    atomic.StorePointer(
        unsafepL, unsafe.Pointer(&px))
  
    // Printed if value is stored
    fmt.Println("Val Stored!")
}

Producción:

Val Stored!

Aquí, el valor unsafe.Pointer se almacena en *addr, por eso el código anterior devuelve el resultado indicado.

Ejemplo 2:

// Program to illustrate the usage of
// StorePointer function in Golang
  
// Including main package
package main
  
// importing fmt, 
// sync/atomic and unsafe
import (
    "fmt"
    "sync/atomic"
    "unsafe"
)
  
// Defining a struct type L
type L struct{ x, y, z int }
  
// Declaring pointer to L struct type
var PL *L
  
// Calling main
func main() {
  
    // Defining *addr unsafe.Pointer
    var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL))
  
    // Defining value 
    // of unsafe.Pointer
    var px = 54634763
  
    // Calling StorePointer and
    // storing unsafe.Pointer
    // value to *addr
    atomic.StorePointer(
        unsafepL, unsafe.Pointer(&px))
  
    // Prints the value of the
    // address where val is stored
    fmt.Println(&px)
}

Producción:

0xc0000b6010  // Can be different at different run times

Aquí, el valor de unsafe.Pointer indicado se almacena y la dirección del valor almacenado se devuelve aquí. Además, la dirección puede ser diferente en diferentes tiempos de ejecución.

Publicación traducida automáticamente

Artículo escrito por nidhi1352singh 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 *