Структуры в Go одновременно и эффективны‚ и очень популярны. Они используются для организации и группировки различных типов данных под одним именем. Структуры — более универсальный тип данных в Go и даже могут быть связаны с функциями, которые называются методами.
Определяя новую структуру, вы группируете набор значений в единый тип данных, который позволяет вам передавать и получать этот набор как единый объект. Структура имеет поля, и у каждого поля есть собственный тип данных, который даже может быть другой структурой или срезом структур. Кроме того, поскольку структура является новым типом данных, она определяется с помощью ключевого слова type, за которым следует название структуры и ключевое слово struct. Следующий код определяет новую структуру Entry:
type Entry struct { Name string Surname string Year int }
Кроме того, вы можете создавать новые экземпляры структуры, используя ключевое слово new(), например:
pS := new(Entry)
Таким образом создаётся объект, который обладает следующими свойствами. Рассмотрим работу со структурами на примере:
package main import "fmt" // Данный код объявляет структуру Entry type Entry struct { Name string Surname string Year int } // в этой функции происходит вывод данных структуры func zeroS() Entry { return Entry{} }
Если переменной не задано начальное значение, то компилятор Go автоматически инициализирует ее нулевым значением ее типа данных. Для структур это означает, что структурная переменная без начального значения инициализируется нулевыми значениями каждого из типов данных ее полей. Следовательно, функция zeroS() возвращает инициализированную нулями структуру Entry.
Добавим функцию добавления элементов в структуру Entry:
// функция добавления данных в структуру Entry: func initS(N, S string, Y int) Entry { if Y < 2000 { return Entry{Name: N, Surname: S, Year: 2000} } return Entry{Name: N, Surname: S, Year: Y} }
Благодаря такому понятию как "срезы структур" мы можем получить доступ к группе элементов структур по заданным параметрам. Пример:
package main import ( "fmt" "strconv" ) type record struct { Field1 int Field2 string } func main() { S := []record{} for i := 0; i < 10; i++ { text := "text" + strconv.Itoa(i) temp := record{Field1: i, Field2: text} S = append(S, temp) } // Accessing the fields of the first element fmt.Println("Index 0:", S[0].Field1, S[0].Field2) fmt.Println("Number of structures:", len(S)) sum := 0 for _, k := range S { sum += k.Field1 } fmt.Println("Sum:", sum) }