No hay clases, el lenguaje C tiene estructuras, entonces, ¿qué tienen de especial las estructuras de Go?
No existe el concepto de "clase" en el lenguaje Go, ni admite conceptos orientados a objetos como la herencia de "clase". El lenguaje Go tiene mayor escalabilidad y flexibilidad que el lenguaje orientado a objetos mediante la incorporación de estructuras e interfaces.
Tipos personalizados
Hay algunos tipos de datos básicos en el lenguaje Go, como cadena, entero, punto flotante, booleano y otros tipos de datos. Puede usar la clave de tipo en el lenguaje Go. palabras para definir tipos personalizados.
Un tipo personalizado define un tipo completamente nuevo. Podemos definirlo según el tipo básico incorporado, o podemos definirlo mediante estructura. Por ejemplo:
A través de la definición de la palabra clave Tipo, MyInt es un nuevo tipo, que tiene las características de int.
Alias de tipo
El alias de tipo es una nueva característica agregada en la versión Go1.9.
Regulaciones de alias de tipo: TypeAlias es solo un alias de Type. En esencia, TypeAlias y Type son el mismo tipo. Al igual que un niño tiene un apodo o un apodo cuando era niño, y después de ir a la escuela, usa un nombre científico, y el profesor de inglés le dará un nombre en inglés, pero todos estos nombres se refieren a él.
type TypeAlias = Type
La runa y el byte que hemos visto antes son alias de tipo. Sus definiciones son las siguientes:
La diferencia entre la definición de tipo. y alias de tipo
En la superficie, solo hay una diferencia de signo igual entre el alias de tipo y la definición de tipo. Podemos entender la diferencia entre ellos a través del siguiente código.
El resultado muestra que el tipo de a es main.NewInt, lo que significa el tipo NewInt definido en el paquete principal. El tipo de b es int. El tipo MyInt solo existirá en el código y no habrá ningún tipo MyInt cuando se complete la compilación.
Los tipos de datos básicos en el lenguaje Go pueden representar los atributos básicos de algunas cosas, pero cuando queremos expresar todos o parte de los atributos de una cosa, usar un solo tipo de datos básicos obviamente no puede cumplir. Sí, el lenguaje Go proporciona un tipo de datos personalizado que puede encapsular múltiples tipos de datos básicos. Este tipo de datos se llama estructura y su nombre en inglés es struct. Es decir, podemos definir nuestro propio tipo mediante estructura.
La orientación a objetos se implementa en el lenguaje Go a través de struct.
Definición de estructura
Utilice las palabras clave type y struct para definir la estructura. El formato de código específico es el siguiente:
Entre ellos:
.Por ejemplo, definimos una estructura Persona (persona), el código es el siguiente:
Los campos del mismo tipo también se pueden escribir en una línea,
En esta De esta manera, tenemos el tipo Definir de una persona, que tiene tres campos: nombre, ciudad y edad, que representan nombre, ciudad y edad respectivamente. De esta manera, podemos utilizar esta estructura de persona para representar y almacenar fácilmente información de la persona en el programa.
Los tipos de datos básicos integrados en el lenguaje se utilizan para describir un valor, mientras que la estructura se utiliza para describir un conjunto de valores. Por ejemplo, una persona tiene un nombre, edad, ciudad de residencia, etc., que es esencialmente un tipo de datos agregado
Creación de instancias de estructura
Solo cuando se crea una instancia de la estructura, se asignará realmente memoria. Es decir, se deben crear instancias de los campos de la estructura antes de poder utilizarlos.
Creación de instancias básicas
Por ejemplo:
Accedemos a los campos (variables miembro) de la estructura a través de ., como p1.name y p1.age esperar .
Estructuras anónimas
Las estructuras anónimas también se pueden utilizar en escenarios como la definición de algunas estructuras de datos temporales.
Crear una estructura de tipo puntero
También podemos crear una instancia de la estructura usando la nueva palabra clave y obtener la dirección de la estructura. El formato es el siguiente:
De los resultados impresos, podemos ver que p2 es un puntero de estructura.
Cabe señalar que el lenguaje Go admite el uso directo de punteros de estructura para acceder a los miembros de la estructura.
Obtener la dirección de la estructura y crear una instancia
Usar amp para obtener la dirección de la estructura equivale a realizar una nueva operación de creación de instancias en el tipo de estructura.
p3.name = "Qimi" es en realidad (*p3).name = "Qimi" en el nivel inferior. Esta es la sintaxis que el lenguaje Go nos ayuda a implementar.
Inicialización de estructura
Las variables miembro de una estructura no inicializada tienen valores cero correspondientes a sus tipos.
Inicialización usando pares clave-valor
Al inicializar una estructura usando pares clave-valor, las claves corresponden a los campos de la estructura y los valores corresponden a los valores iniciales de los campos.
También puede inicializar el puntero de estructura con pares clave-valor, por ejemplo:
Cuando algunos campos no tienen un valor inicial, no es necesario escribir el campo. En este momento, el valor de un campo que no especifica un valor inicial es el valor cero del tipo de campo.
Inicializar usando una lista de valores
Al inicializar la estructura, puede usar la abreviatura, es decir, no escribir las claves durante la inicialización, sino escribir directamente los valores:
Utilice esto Al inicializar el formato, debe prestar atención a:
Diseño de la memoria de la estructura
La estructura ocupa una parte continua de la memoria.
Resultado:
Puntos de conocimiento avanzado sobre la alineación de la memoria en el lenguaje Go Lectura recomendada: Alineación adecuada de la memoria en Go
Preguntas de la entrevista
Qué Cuál es el resultado de la ejecución del siguiente código?
Constructor
La estructura del lenguaje Go no tiene constructor, podemos implementarlo nosotros mismos. Por ejemplo, el siguiente código implementa un constructor de persona. Debido a que struct es un tipo de valor, si la estructura es compleja, la sobrecarga de rendimiento de la copia de valores será relativamente grande, por lo que el constructor devuelve un tipo de puntero de estructura.
Llamada al constructor
Métodos y receptores
Un método (Método) en el lenguaje Go es una función que actúa sobre una variable de un tipo específico. Este tipo específico de variable se llama Receptor. El concepto de receptor es similar a este o yo en otros idiomas.
El formato de definición del método es el siguiente:
Entre ellos,
Por ejemplo:
La diferencia entre métodos y funciones es que las funciones no pertenecen a ningún tipo, los métodos pertenecen a un tipo específico.
Receptor de tipo puntero
El receptor de tipo puntero consiste en un puntero a una estructura. Debido a las características de los punteros, cualquier variable miembro del puntero del receptor se modifica al llamar a un. Una vez finalizado el método, las modificaciones son efectivas. Este método es muy parecido a este o self en lenguajes orientados a objetos en otros lenguajes. Por ejemplo, agregamos un método SetAge a Person para modificar la edad de la variable de instancia.
Llame a este método:
Receptor de tipo de valor
Cuando el método actúa sobre un receptor de tipo de valor, el lenguaje Go convertirá el receptor al tipo de valor cuando el código se está ejecutando. Haga una copia del valor. El valor del miembro del receptor se puede obtener en el método del receptor de tipo de valor, pero la operación de modificación solo apunta a la copia y no puede modificar la variable del receptor en sí.
Cuándo deberías usar receptores de tipo puntero
Agregar métodos de cualquier tipo
En el lenguaje Go, el tipo de receptor puede ser cualquier tipo, no solo Estructura, cualquier tipo puede tener métodos. Por ejemplo, podemos usar la palabra clave type para definir un nuevo tipo personalizado basado en el tipo int incorporado y luego agregar métodos a nuestro tipo personalizado.
Nota: Los tipos no locales no pueden definir métodos, lo que significa que no podemos definir métodos para tipos en otros paquetes.
Campos anónimos de estructuras
Los campos anónimos utilizan nombres de tipo como nombres de campo de forma predeterminada. Las estructuras requieren que los nombres de campo sean únicos, por lo que los campos anónimos del mismo tipo en una estructura solo pueden. Hay uno.
Estructuras anidadas
Una estructura puede estar anidada dentro de otra estructura o de un puntero de estructura.
Estructura anónima anidada
Al acceder a un miembro de la estructura, el campo se buscará primero en la estructura. Si no se encuentra, se buscará en la estructura anónima.
Conflictos de nombres de campos en estructuras anidadas
Los mismos nombres de campos pueden existir dentro de estructuras anidadas. En este momento, para evitar ambigüedades, debe especificar los campos de la estructura incrustada específica.
"Herencia" de estructuras
El uso de estructuras en el lenguaje Go también puede implementar la herencia orientada a objetos en otros lenguajes de programación.
Visibilidad de los campos de la estructura
Los campos en una estructura que comienzan con letras mayúsculas indican acceso público, mientras que las letras minúsculas indican privado (accesible solo en el paquete que define la estructura actual).
Estructura y serialización JSON
JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos. Fácil de leer y escribir para los humanos. También es fácil de analizar y generar para las máquinas. Los pares clave-valor JSON son una forma de guardar objetos JS. El nombre de la clave en la combinación del par clave/valor se escribe delante y entre comillas dobles "", separadas por dos puntos:, y luego seguidas por el valor entre varias claves; valores Utilice inglés, separado.
Etiqueta de estructura (Etiqueta)
La etiqueta es la metainformación de la estructura, que se puede leer a través del mecanismo de reflexión en tiempo de ejecución. La etiqueta se define después del campo de estructura y está envuelta por un par de comillas invertidas. El formato específico es el siguiente:
`clave1: "valor1" clave2: "valor2"`
Estructura. Las etiquetas constan de uno o más pares clave-valor. Las claves y los valores están separados por dos puntos y los valores están entre comillas dobles. Los pares clave-valor están separados por un espacio. Nota: Al escribir etiquetas para estructuras, debe cumplir estrictamente con las reglas de los pares clave-valor. La tolerancia a fallas del código de análisis de etiquetas de estructura es muy pobre. Una vez que el formato se escribe incorrectamente, no se generarán errores durante la compilación y el tiempo de ejecución, y el valor no se puede obtener correctamente mediante la reflexión. Por ejemplo, no agregue espacios entre la clave y el valor.
Por ejemplo, definimos la Etiqueta utilizada en la serialización json para cada campo de la estructura Student: