Go — это строго типизированный язык, а тип — это жизнь. Этот язык имеет богатые типы и хорошую поддержку для расширения типа. Тип обеспечивает целостность.
В этой статье я расскажу о некоторых примитивных типах и о том, как Go их обрабатывает.
В компьютере все равно 0 или 1, и только эти 2 значения используются для представления любых значений, которые мы хотим.
Расположение 0 или 1 говорит о том, что является значением.
Возьмите пример значения байта в некоторой области памяти:
Что это такое ? Вам нужна информация о типе.
Если тип int, то значение равно 10, если тип enum, то у нас есть другое значение.
Информация о типе говорит нам о значении и размере, например, если тип является логическим, то он сообщает, что это однобайтовое значение.
Информацию о типах, поддерживаемых Go, можно найти на странице Lang Spec Types .
Как объявить переменную?
1
|
var variablename type<br><br>variablename := value // Short declaration |
Оба из вышеперечисленных объявляют переменную, но способ ее инициализации сильно отличается.
Var создает и инициализирует со значением ZERO своего типа, значение Zero очень особенное, оно делает код свободным и чистым! Нет нулевых проверок.
Нулевое значение основано на типе, поэтому для целочисленного типа оно равно нулю, логическое — ложно, строка — пуста.
Go имеет некоторый тип, например int, который получает размер на основе базовой архитектуры, например, он будет 4 байта (то есть 32-битная дуга) или 8 байтов (64-битная дуга). Это также хороший пример механической симпатии к базовой платформе.
Примеры объявления переменных:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
var value int var f float64 var b bool var by byte var name string var x rune //Variable are declared and initialized by compiler to ZERO VALUE of its type fmt.Printf( "value %T -> (%v) \n" , value, value) fmt.Printf( "f %T -> (%v) \n" , f, f) fmt.Printf( "b %T -> (%v) \n" , b, b) fmt.Printf( "by %T -> (%v) \n" , by, by) fmt.Printf( "name %T -> (%v) \n" , name, name) fmt.Printf( "x %T -> (%v) \n" , x, x) fmt.Println( "*******************" ) value1 := 10 f1 := 3.14 b1 := true name1 := "Say Hello" x1 := 100 fmt.Printf( "value %T -> (%v) \n" , value1, value1) fmt.Printf( "f %T -> (%v) \n" , f1, f1) fmt.Printf( "b %T -> (%v) \n" , b1, b1) fmt.Printf( "name %T -> (%v) \n" , name1, name1) fmt.Printf( "x %T -> (%v) \n" , x1, x1) |
Псевдоним для встроенного типа
Это очень мощная функция, которая позволяет расширять встроенные типы путем добавления поведения.
Пример псевдонима типа:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
//Create Alias for int type type RichInt int func main() { var ri RichInt ri = 100 fmt.Println( "Value of rich int" , ri) fmt.Println( "Convert to Int" , int(ri)) fmt.Println( "From int to Rich Int" , RichInt(100)) fmt.Println( "Binary Value" , ri.toBinary()) } |
В приведенном выше примере RichInt имеет функцию toBinary, которая возвращает двоичное значение. Позже я поделюсь, как расширить типы, когда мы исследуем методы типов.
Кастинг против конверсии
Кастинг — это магия, он позволяет неявно конвертировать один тип в другой. Сколько раз в java вы теряли значение, когда использовали long / int casting или double / float?
Go имеет концепцию конверсии. Вы явно конвертируете из x в y и оплачиваете стоимость дополнительной памяти за счет безопасности.
Go Lang Spec имеет несколько хороших примеров.
Несколько реальных пользовательских типов
В Go lang есть поддержка типа Struct, это чистый тип значения, к которому не прилагается шум поведения.
Это дает контроль над макетом памяти, вы можете выбрать действительно компактный макет памяти, чтобы избежать заполнения или добавить заполнение, если требуется.
Структура может быть объявлена как ниже:
1
2
3
4
5
|
type person struct { firstName string lastName string age int } |
Как только структура определена, мы можем создать значение типа структуры.
Это ценность, а не объект, просто запомните это!
Значение может быть создано с помощью приведенного ниже кода:
1
|
var p1 person |
Приведенный выше код создал значение и инициализировал его нулевым значением, строка инициализируется пустым значением, а int — 0.
При обработке p1 проверка нуля не требуется, поскольку она инициализируется нулевым значением.
Короткое объявление может использоваться для указания ненулевого или другого значения:
1
|
p2 := person{firstName: "James" , lastName: "Bond" , age: 35} |
Нулевая ценность и удобный способ создания стоимости убивает необходимость иметь конструктор или деструктор в Go.
Теперь вы можете начать видеть силу ценности. Никаких накладных расходов на конструктор / деструктор / или сложный жизненный цикл.
Я знаю, что у вас возникнет вопрос по поводу специального кода инициализации или кода очистки, который требуется?
Поведение обрабатывается очень по-разному, мы рассмотрим это позже.
Struct также может быть вложенным, а нулевое значение или короткое объявление работает как волшебство!
Мы создадим дополнительную структуру:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
ype address struct { address1 string address2 string city string } type contact struct { landLine int mobile int } type person struct { firstName string lastName string age int add address contactDetails contact } p3 := person{firstName: "James" , lastName: "Bond" , age: 35, add: address{address1: "30 Wellington Square" , address2: "Street 81" }, contactDetails: contact{mobile: 11119999}} |
Смотрите оригинальную статью здесь: что такое Golang Types Мнения, высказанные участниками Java Code Geeks, являются их собственными. |