El contexto es una de las características críticas de Go que permite la simultaneidad. En Go, "contexto" se refiere a un paquete que proporciona funcionalidad para valores de ámbito de solicitud y señales de cancelación a través de los límites de la API.
El paquete context trabaja simultáneamente con el modelo de concurrencia de Go, basado en el concepto de goroutines. Goroutines son subprocesos ligeros de ejecución que puede crear y administrar de manera eficiente, lo que facilita la creación de programas simultáneos en Go.
El paquete de contexto
El paquete de contexto proporciona funcionalidad para cancelar funciones de ejecución prolongada o cadenas de llamadas completas. El paquete también ayuda a almacenar valores de ámbito de solicitud para acceder a cualquier lugar dentro de la cadena de llamadas. Esta característica es útil cuando se trabaja con
API o microservicios, donde las solicitudes pueden abarcar múltiples llamadas a funciones y desea cancelarlas o adjuntarles valores específicos.Así es como puede importar el paquete de contexto en su ir programas.
importar"contexto"
Las funciones de contexto toman en Contexto tipo de estructura del paquete de contexto. Convencionalmente, debe usar ctx como el nombre de la variable de instancia.
funciónoperaciones(contexto ctx. Contexto) {
}
Las funciones pueden devolver el tipo de estructura Contexto para otras funciones y operaciones.
funciónoperaciones(contexto ctx. Contexto)contexto.Contexto {
}
Puede crear un nuevo contexto con el HACER función del paquete de contexto. La función TODO crea un nuevo contexto con el valor de contexto. Hecho(), un canal que se cerrará con la cancelación del contexto. Debe usarlo como marcador de posición cuando necesite un contexto pero ningún contexto principal sea adecuado.
importar"contexto"
funciónprincipal() {
ctx := contexto. HACER()
}
Alternativamente, el Fondo La función crea un nuevo contexto sin valor y un canal Listo vacío.
ctx := contexto. Fondo()
Debe usar la función Fondo como la raíz de un árbol de contexto.
Contexto con valores
El paquete de contexto proporciona funcionalidad para propagar valores y señales de cancelación. Puede utilizar los valores para obtener información, desde datos del ámbito de la solicitud hasta señales de cancelación y plazos.
El paquete de contexto también permite la creación de contextos secundarios heredados de los contextos principales, lo que permite manejo de valores y señales de cancelación a lo largo de un programa ya que puede pasar el contexto a través de múltiples funciones
Aquí hay un ejemplo de pasar contexto a través de funciones con el paquete de contexto.
importar (
"contexto"
)funcióncontexto valioso(contexto ctx. Contexto)contexto.Contexto {
devolver contexto. ConValor (ctx, "llave maestra", "hfouneqcelkwfu")
}
funciónrecibirContextData(contexto ctx. Contexto)cualquier {
clave de acceso: = ctx. Valor("llave maestra")
devolver llave maestra
}
El contexto valioso La función toma una instancia de contexto y devuelve una instancia de contexto para la siguiente función. La instancia de contexto es un valor creado con el ConValor método. El método WithValue toma la instancia de contexto de la función y un par clave-valor.
Para recuperar los datos del contexto, deberá crear un nuevo contexto con el HACER o Fondo función y pasar el contexto a la función (en este caso, valueContext) y recibir el contexto con el recibirContextData función.
funciónprincipal() {
ctx := contexto. Fondo()
ctx = contexto valioso (ctx)
fmt. Println (recibirContextData (ctx))
}
La variable ctx es la instancia de contexto de la función de fondo. La función valueContext toma la variable ctx y devuelve el contexto con un valor que toma la función receiveContextData y devuelve el valor del par clave-valor.
Tiempos de espera y plazos de contexto
El contexto El paquete proporciona funcionalidad para establecer tiempos de espera y fechas límite en las operaciones. Establecer tiempos de espera y fechas límite es útil para las operaciones que necesitan ponerse al día.
Los tiempos de espera son la duración del tiempo que tarda una operación. Puede establecer un tiempo de espera para que una operación tarde 4 segundos; después de eso, el contexto cancela la solicitud.
Por otro lado, una fecha límite define el punto absoluto donde una operación debe cancelarse.
Puedes usar el Con tiempo de espera método para establecer un tiempo de espera de contexto. Así es como puede establecer un tiempo de espera de 2 segundos.
funciónprincipal() {
ctx, cancelar := contexto. WithTimeout (contexto. Fondo(), 2 * tiempo. Segundo)
aplazar Cancelar()
// alguna operación
}
El principal La función crea un contexto con un tiempo de espera de dos segundos. La función WithTimeout devuelve una función de cancelación que puede diferir para la cancelación al salir de la función principal.
Puede declarar plazos con el ConFecha límite método. El método WithDeadline toma una instancia de contexto y una fecha límite.
funciónhacer algo(contexto ctx. Contexto) {
fecha límiteTiempo := tiempo. Ahora().Añadir(1500 * tiempo. Milisegundo)
ctx, ctxCancelar := contexto. ConFecha límite (ctx, fecha límiteHora)
aplazar ctxCancelar()// alguna operación
ctxCancelar()
}
El hacer algo función toma en un contexto, y el fecha límiteTiempo variable es el tiempo antes de la contexto fecha límite. El ctx variable es el contexto con una fecha límite.
El ctxCancelar La variable cancela el contexto cuando el contexto excede su fecha límite.
Prácticas recomendadas para usar contextos en Go
Evite usar contextos como variables globales. El uso de contextos como variables globales puede generar comportamientos de código inesperados y errores difíciles de rastrear, y use el contexto con moderación para reducir la complejidad del código.
Finalmente, use los contextos como señales, no como garantías. Cancelar un contexto no garantiza que todas las gorutinas dejarán de ejecutarse; es simplemente una señal, y las gorrutinas son independientes de los contextos.