Задать вопрос
@mirfiqq

Не точность формулировки в книге, или же я не понимаю?

Учу новый для себя язык Go, решил изучать используя книгу the first go, официальную документацию и тд (совмещая). У меня есть совсем немного познаний о языках как низкоуровневых так и высокоуровневых на базовом уровне, поэтому книга дается легко, за более низкоуровневой инфой лезу в доки, ибо инфы с книги мало. И вот, изучая 2 главу натыкаюсь на это:
package main 

import ( 
    "fmt"
    "time" 
) 

func main() {
 var now time.Time = time.Now()
 var year int = now.Year() 
 fmt.Println(year) 
}


и тут пишут

Функция time.Now возвращает новое значение Time для текущей даты и времени; это значение сохраняется в переменной now. Затем мы вызываем метод Year для значения, ссылка на которое хранится в now:

Гуру программисты и знатоки, подскажите, это не верный перевод? Не уместная формулировка? Или я чего-то не понимаю?

now по факту это экземпляр структуры Time, now хранит значение текущей даты и времени

Именно хранит, выделяет память под конкретный тип данных и является переменной, по которой можно обратиться к этому значению (то есть простыми словами просто копирует структуру)

Или тут имеется в виду то, что переменная выделяет память под конкретный тип данных и ссылается по имени этой переменной к определенному регистру, где как раз выделена память под это значение?
Типо формулировка ссылка на которое хранится в now имеет все таки смысл?

Просто как мне кажется, now не хранит в себе ссылку на значение, он хранит в себе именно то самое значение (структуру)
Или тут вообще про указатели?
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
Go - язык, который сознательно создавался, как очень простой язык. В Go всегда всё копируется. Если это базовый тип, то копируется базовый тип, если это структура, то копируется структура, если это массив, то копируется весь массив, если это указатель, то копируется указатель. Если это дескриптор слайса, то копируется этот дескриптор (не сами данные). И нет этих внезапных указателей, которые могут испортить жизнь джаваскриптизёру или пыхарю.

Поэтому, в Go не надо зазубривать, какие операции что возвращают, а мы просто глядим в нашей мега-IDE, что конкретно нам возвращает time.Now()
А возсращает она нам очень простую структурку time.Time

type Time struct {
    wall uint64
    ext  int64
    loc  *Location
}


И что мы видим? Что из ссылок в этой структуре только loc, который занимается исключительно часовыми поясами, а само время хранится в обычных целочисленных переменных без всяких ссылок. А т.к., как мы говорили ранее, в Go всегда всё копируется, то внезапному указателю (ссылке) просто неоткуда взяться.

Если вы запамятовали, и сомневаетесь, что происходит при присваивании, например, слайса, мапы или интерфейса, то лучшим способом это определить будет не зазубривать, а изучить, как устроены слайс, мапа или интерфейс изнутри, и тогда вы сами всё поймёте. И сделать это будет несложно, потому что язык Go написан на языке Go и использует свои же примитивы для своих же структур данных.

Из всего вышеописанного мы делаем вывод, что не все книжки одинаково полезны даже для подтирания, не то что для изучения.

Я рекомендую вам самый лучший инструмент для первоначального вкатывания в Go - это официальный курс "A Tour of Go", где вы в интерактивном режиме изучите базовые основы языка за пару дней. А дальше уже можно смотреть на книги, и уже самому находить в них такие вот несуразности. Не стесняйтесь преходить прямо в IDE на типы или определения функций, чтобы самому смотреть, что же там возвращается. Так как, на наше счастье, Go - это строго-типизированный язык, то никаких сюрпризов и подвохов там не будет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121
Начни с документации
Гуру программисты и знатоки, подскажите, это не верный перевод?
Посмотрите в оригинал и сравните сами. Мы понятия не имеем ни что за книга, ни что за перевод.

Не уместная формулировка?
В чем проблема формулировки?

Или я чего-то не понимаю?
Да

Функция time.Now возвращает новое значение

Просто как мне кажется, now не хранит в себе ссылку на значение, он хранит в себе именно то самое значение


Вам сказали что там значение, вы подумали что там значение, проблема то в чем?
Как выглядят указатели в го вам вероятно покажут в соответствующем разделе. В данном случае было бы var pt *time.Time
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы