Или func не объявление функции?
func это обьявление функции.
Все обязательно через функции?
Нет, можно писать код и вне функции, тут дело вот в чем.
Когда запускается программа, Go ищет в исполняемом файле функцию main и запускает её (как, к примеру, Java запускает метод main класса).
В Go существует две таких функции: init() и main().
Код в этих функциях будет исполнен единожды, при запуске программы.
--
Для наглядности, переделаем наш последний код:
package main
import "fmt"
import "net/http"
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, world!")
fmt.Println("Запрос обработан.")
}
func main() {
fmt.Println("Сервер запущен.")
http.HandleFunc("/", Handler)
http.ListenAndServe(":9000", nil)
}Запустим из командной строки и сразу получим ответ: Сервер запущен.
Затем сделаем запрос через браузер (http://127.0.0.1:9000) и наблюдаем за консолью.
При каждом обращении, в консоле будет появляться новая фраза Запрос обработан., но Сервер запущен повторяться более не будет.