Настройка VS Code для работы с Go (начало)
Настройка VS Code для работы с Go (начало)

Настройка VS Code для работы с Go (начало)

5 января 2025       104 просмотра

Итак, вы наткнулись на очередную статью, которая не помогла. Или ответ искусственного идиота чат-бота оказался бесполезен.

Логично предположить, что для начала работы нам понадобится Go и VS Code, качаем их по соответствующим ссылкам:

Golang

VS Code

Go

VS Code

Выбирайте свою ОС и качайте, в случае с Linux — можете поставить это из репозиториев, так будет даже правильнее, зря что ли мэйнтейнеры свои сухари с водой едят?

Процесс установки я опущу, он прост до безобразия (далее-далее-далее...)

Самое интересное, что просто так вы не сможете открыть студию и тут же начать писать hello в рот... Требуются небольшие доп. манипуляции:

1. Жамкаем в открытой VS Code Ctrl+Shift+P и выбираем /или впечатываем) — Go: Install/Update tools, не заморачиваемся, выбираем все пункты и жамкаем «OK».

вот эти ребята

устанавливаем

как-то так

2. После скачивания и установки этих тулз идем в расширения (Ctrl+Shift+X) и выбираем там Go, устанавливаем

Расширение

3. Чтобы наши волосы были мягкими и шелковистыми у нас всё заработало, создаём мод файл, допустим, командой go mod init

Инициализация

Далее мы можем проверить как оно работает и работает ли вообще. Писать hello в рот скучно, предлагаю набросать код, который берёт гусары молчать время с какого-нибудь NTP-сервера.

Допустим так:

package main

import (
	"fmt"
	"net"
	"time"
)

func main() {
	conn, err := net.Dial("udp", "pool.ntp.org"+":123") //сервер и порт можете использовать на свой выбор
	if err != nil {
		fmt.Printf("could not connect to NTP server") //ну, не подключились, так не подключились...
	}
	defer conn.Close()

	var ntpPacket = make([]byte, 48) //инициализируем пакет
	ntpPacket[0] = 0x1B              //версия 3

	// отправляем запрос
	if _, err := conn.Write(ntpPacket); err != nil {
		fmt.Printf("could not send NTP request") //ну, не отправили, так не отправили...
	}

	// читаем ответ
	if err := conn.SetReadDeadline(time.Now().Add(10 * time.Second)); err != nil {
		fmt.Printf("could not set read deadline") //и опять проверяем — всё ли хорошо
	}
	if _, err := conn.Read(ntpPacket); err != nil {
		fmt.Printf("could not read NTP response") //и умеем ли мы читать )
	}

	// извлекаем и всё такое —
	seconds := uint32(ntpPacket[40])<<24 | uint32(ntpPacket[41])<<16 | uint32(ntpPacket[42])<<8 | uint32(ntpPacket[43])
	fraction := uint32(ntpPacket[44])<<24 | uint32(ntpPacket[45])<<16 | uint32(ntpPacket[46])<<8 | uint32(ntpPacket[47])

	// подробнее можете почитать про time в Go — https://golangify.com/go/time
	ntpEpoch := time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC)
	ntpTime := ntpEpoch.Add(time.Duration(seconds)*time.Second + time.Duration(fraction*1000000000/4294967)*time.Millisecond) //миллисекундной точности нам хватит

	var time = ntpTime //не хочу заморачиваться с приведением типов
	fmt.Printf(time.Format("2006/02/01 15:04:05"))
}

Пробуем запустить, нажав F5

время

Вот и всё, пользуемся =)