Por qué reflejar. MakeSlice devuelve un valor no direccionable
En Go, el paquete reflect proporciona una interfaz para inspeccionar y manipular tipos y valores. reflect.MakeSlice crea una porción de un tipo determinado. Sin embargo, el valor devuelto no es direccionable. Esto significa que no puede tomar su dirección ni asignarla a un puntero.
Solución: uso de reflect.New()
Para obtener un segmento direccionable usando la reflexión, Puede usar la función reflect.New() para crear un puntero al sector. Esto se puede hacer de la siguiente manera:
// Create the slice type sliceType := reflect.SliceOf(SomeType) // Create a slice using reflect.MakeSlice slice := reflect.MakeSlice(sliceType, 10, 10) // Create a pointer to the slice slicePtr := reflect.New(slice.Type()) // Set the slice pointer to the slice slicePtr.Elem().Set(slice)
Ahora tiene un segmento direccionable que se puede pasar como argumento a funciones que requieren un puntero de segmento.
Por qué reflexionar. MakeSlice devuelve un valor no direccionable
Las variables de la pila local en Go no son direccionables porque el tiempo de ejecución puede moverlas al montón en cualquier momento. reflect.MakeSlice crea una variable de sector local, por lo que el valor devuelto no es direccionable.
Por qué se requiere un puntero a un sector
Algunas API, como como el que mencionaste del paquete mgo, requiere un puntero a un segmento como argumento. Esto se debe a que al agregar al segmento, se puede asignar un nuevo segmento con mayor capacidad. Si pasa un segmento sin puntero, los cambios realizados en el segmento no serán visibles fuera de la función.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3