cpp

Функция init()

Вы заметили, как мы подключали пакет github.com/go-sql-driver/mysql в листинге 12.6? Напомню:

import (
   "fmt"
   "database/sql"
   _ "github.com/go-sql-driver/mysql"
)

Мы подключили пакет и проигнорировали его, указав в качестве псевдонима символ подчеркивания. При этом внутри программы нигде больше не обращались к этому пакету. Зачем же мы подключали пакет? Дело в том, что при подключении пакета автоматически вызывается функция с названием init(), внутри которой можно выполнить инициализацию пакета, например, присвоить глобальным переменным некоторые значения. Если мы откроем файл C:\Users\<Имя пользователя>\go\pkg\mod\github.com\go-sql-driver\mysql@v1.6.0\driver.go, то сможем найти следующий фрагмент кода:

func init() {
   sql.Register("mysql", &MySQLDriver{})
}

Внутри функции init() вызывается функция Register() из пакета database/sql, которая выполняет регистрацию драйвера. Функциями из пакета database/sql мы в дальнейшем как раз и пользуемся в нашей программе.

Пример использования функции init() приведен в листинге 12.7.

Листинг 12.7. Функция init()

package main

import "fmt"

var msg string

func init() {
   msg = "func init()"
}
func main() {
   fmt.Println(msg) // func init()
}

Ранее мы всегда говорили, что первой в программе вызывается функция main(). Как видно из результата это не так. Первой вызывается функция init() внутри каждого подключенного пакета и лишь затем управление передается в функцию main(). На самом деле это не единственная странность. Раньше мы говорили, что название функции должно быть уникальным и что нельзя создать две одноименные функции. Функция init() является исключением из этого правила. Мы можем создать сразу несколько функций init() внутри пакета (листинг 12.8).

Листинг 12.8. Несколько функций init()

package main

import "fmt"

func init() {
   fmt.Println("init() 1")
}
func init() {
   fmt.Println("init() 2")
}
func init() {
   fmt.Println("init() 3")
}
func main() {
   fmt.Println("main()")
}

Запустим программу на выполнение и посмотрим на результат:

C:\book\packages>go run main.go
init() 1
init() 2
init() 3
main()

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp