Область видимости функции

Область видимости функции определяет, из каких частей программы можно обратиться к функции. В Go видимость функции зависит от того, с какой буквы начинается её имя и на каком уровне она объявлена. Если функция объявлена с заглавной буквы (например, MyFunction), она экспортируется и доступна вне пакета. Если имя функции начинается со строчной буквы (например, myFunction), функция является неэкспортированной и доступна только внутри своего пакета.

Синтаксис

Объявление функции в Go имеет следующий синтаксис:

gofunc FunctionName(params) returnType {
  // тело функции
}

Видимость определяется первой буквой имени функции:

Пример

Рассмотрим пример с двумя функциями в пакете: одна экспортированная, другая — нет. Файл main.go:

gopackage main

import "fmt"

// ExportedFunction доступна вне пакета (начинается с заглавной)
func ExportedFunction() {
  fmt.Println("This is an exported function")
}

// unexportedFunction доступна только внутри пакета (начинается со строчной)
func unexportedFunction() {
  fmt.Println("This is an unexported function")
}

func main() {
  ExportedFunction()   // работает
  unexportedFunction() // работает внутри того же пакета
}

Результат выполнения кода:

go"This is an exported function"
"This is an unexported function"

Пример

Если попытаться вызвать неэкспортированную функцию из другого пакета, возникнет ошибка компиляции. Предположим, у нас есть пакет mypkg с функцией unexportedFunc:

gopackage mypkg

func unexportedFunc() string {
  return "Hello from unexported function"
}

При попытке использовать эту функцию в другом пакете:

gopackage main

import "mypkg"

func main() {
  // Ошибка: cannot refer to unexported name mypkg.unexportedFunc
  // res := mypkg.unexportedFunc()
}

Пример

Экспортированная функция может быть вызвана из другого пакета. Создадим пакет mypkg с экспортированной функцией:

gopackage mypkg

func ExportedFunc() string {
  return "Hello from exported function"
}

Используем её в основном пакете:

gopackage main

import (
  "fmt"
  "mypkg"
)

func main() {
  res := mypkg.ExportedFunc()
  fmt.Println(res)
}

Результат выполнения кода:

go"Hello from exported function"

Смотрите также