Область видимости функции
Область видимости функции определяет, из каких частей программы можно обратиться к функции.
В Go видимость функции зависит от того, с какой буквы начинается её имя и на каком уровне она объявлена.
Если функция объявлена с заглавной буквы (например, MyFunction), она экспортируется и доступна вне пакета.
Если имя функции начинается со строчной буквы (например, myFunction), функция является неэкспортированной и доступна только внутри своего пакета.
Синтаксис
Объявление функции в Go имеет следующий синтаксис:
func FunctionName(params) returnType {
// тело функции
}
Видимость определяется первой буквой имени функции:
func ExportedFunc()— доступна из других пакетовfunc unexportedFunc()— доступна только внутри своего пакета
Пример
Рассмотрим пример с двумя функциями в пакете: одна экспортированная, другая — нет.
Файл main.go:
package 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() // работает внутри того же пакета
}
Результат выполнения кода:
"This is an exported function"
"This is an unexported function"
Пример
Если попытаться вызвать неэкспортированную функцию из другого пакета, возникнет ошибка компиляции.
Предположим, у нас есть пакет mypkg с функцией unexportedFunc:
package mypkg
func unexportedFunc() string {
return "Hello from unexported function"
}
При попытке использовать эту функцию в другом пакете:
package main
import "mypkg"
func main() {
// Ошибка: cannot refer to unexported name mypkg.unexportedFunc
// res := mypkg.unexportedFunc()
}
Пример
Экспортированная функция может быть вызвана из другого пакета.
Создадим пакет mypkg с экспортированной функцией:
package mypkg
func ExportedFunc() string {
return "Hello from exported function"
}
Используем её в основном пакете:
package main
import (
"fmt"
"mypkg"
)
func main() {
res := mypkg.ExportedFunc()
fmt.Println(res)
}
Результат выполнения кода:
"Hello from exported function"
Смотрите также
-
правила видимости для
экспортированных идентификаторов,
которые доступны за пределами пакета -
правила видимости для
неэкспортированных идентификаторов,
которые доступны только внутри пакета -
понятие
области видимости на уровне пакета,
которая охватывает все функции и переменные пакета -
понятие
блочной области видимости,
которая ограничивается фигурными скобками