Массивы Go позволяют вам определять переменные, которые могут содержать несколько элементов данных одного вида. Структура — это еще один пользовательский тип данных, доступный в программировании на Go, который позволяет комбинировать элементы данных различных типов.
Структуры используются для представления записи. Предположим, вы хотите отслеживать книги в библиотеке. Вы можете отслеживать следующие атрибуты каждой книги —
- заглавие
- автор
- Предмет
- ID книги
В таком сценарии структуры очень полезны.
Определение структуры
Чтобы определить структуру, вы должны использовать операторы типа и структуры . Оператор struct определяет новый тип данных с несколькими членами для вашей программы. Оператор type связывает имя с типом, который в нашем случае является struct. Формат оператора структуры следующий:
type struct_variable_type struct { member definition; member definition; ... member definition; }
После определения типа структуры его можно использовать для объявления переменных этого типа с использованием следующего синтаксиса.
variable_name := structure_variable_type {value1, value2...valuen}
Доступ к членам структуры
Чтобы получить доступ к любому члену структуры, мы используем оператор доступа к члену (.). Оператор доступа к элементу кодируется как точка между именем структурной переменной и элементом структуры, к которому мы хотим получить доступ. Вы должны использовать ключевое слово struct для определения переменных типа структуры. В следующем примере объясняется, как использовать структуру —
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* Declare Book1 of type Book */ var Book2 Books /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = "Go Programming" Book1.author = "Mahesh Kumar" Book1.subject = "Go Programming Tutorial" Book1.book_id = 6495407 /* book 2 specification */ Book2.title = "Telecom Billing" Book2.author = "Zara Ali" Book2.subject = "Telecom Billing Tutorial" Book2.book_id = 6495700 /* print Book1 info */ fmt.Printf( "Book 1 title : %s\n", Book1.title) fmt.Printf( "Book 1 author : %s\n", Book1.author) fmt.Printf( "Book 1 subject : %s\n", Book1.subject) fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id) /* print Book2 info */ fmt.Printf( "Book 2 title : %s\n", Book2.title) fmt.Printf( "Book 2 author : %s\n", Book2.author) fmt.Printf( "Book 2 subject : %s\n", Book2.subject) fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book 1 title : Go Programming Book 1 author : Mahesh Kumar Book 1 subject : Go Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
Структуры как аргументы функций
Вы можете передать структуру в качестве аргумента функции так же, как и любую другую переменную или указатель. Вы будете обращаться к структурным переменным так же, как в предыдущем примере:
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* Declare Book1 of type Book */ var Book2 Books /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = "Go Programming" Book1.author = "Mahesh Kumar" Book1.subject = "Go Programming Tutorial" Book1.book_id = 6495407 /* book 2 specification */ Book2.title = "Telecom Billing" Book2.author = "Zara Ali" Book2.subject = "Telecom Billing Tutorial" Book2.book_id = 6495700 /* print Book1 info */ printBook(Book1) /* print Book2 info */ printBook(Book2) } func printBook( book Books ) { fmt.Printf( "Book title : %s\n", book.title); fmt.Printf( "Book author : %s\n", book.author); fmt.Printf( "Book subject : %s\n", book.subject); fmt.Printf( "Book book_id : %d\n", book.book_id); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book title : Go Programming Book author : Mahesh Kumar Book subject : Go Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
Указатели на структуры
Вы можете определить указатели на структуры так же, как вы определяете указатель на любую другую переменную следующим образом:
var struct_pointer *Books
Теперь вы можете сохранить адрес структурной переменной в указанной выше переменной-указателе. Чтобы найти адрес структурной переменной, поместите оператор & перед именем структуры следующим образом:
struct_pointer = &Book1;
Чтобы получить доступ к членам структуры, используя указатель на эту структуру, вы должны использовать «.» оператор следующим образом —
struct_pointer.title;
Давайте перепишем приведенный выше пример, используя указатель структуры —
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* Declare Book1 of type Book */ var Book2 Books /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = "Go Programming" Book1.author = "Mahesh Kumar" Book1.subject = "Go Programming Tutorial" Book1.book_id = 6495407 /* book 2 specification */ Book2.title = "Telecom Billing" Book2.author = "Zara Ali" Book2.subject = "Telecom Billing Tutorial" Book2.book_id = 6495700 /* print Book1 info */ printBook(&Book1) /* print Book2 info */ printBook(&Book2) } func printBook( book *Books ) { fmt.Printf( "Book title : %s\n", book.title); fmt.Printf( "Book author : %s\n", book.author); fmt.Printf( "Book subject : %s\n", book.subject); fmt.Printf( "Book book_id : %d\n", book.book_id); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —