2. Go -- объектно-ориентированный?
Нет. Но если сильно хочеться, то да:
● Есть типы и методы
● Нет иерархии типов (наследования)
● Зато есть интерфейсы (полиморфизм)
● Инкапсуляция (приватность, публичность)
● Композиция вместо наследования
3. Packages
Пакет -- это каталог с файлами, которые
начинаются с одной и той же
строки:package package_name
Близкий аналог -- namespace
4. Packages
Один пакет может содержать много кода:
определений типов, методов, функций.
Пакет -- это область видимости для
объявленных в нем типов, переменных,
функций, и т.д.
5. Packages
Все что определено как приватное в пакете -
- остается в пакете:
package my_secret_stuff
var (
myHiddenSecret string // Только мой пакет знает, что внутри
)
Код в пакете удобно структурировать по
файлам.
6. Structs
Структуры -- типы, похожие на структуры C.
Структура состоит из полей.
Может включать в себя другие структуры.
7. Structs
Структура, которая содержит в себе другую
структуру (или даже несколько), получает
всю ее силу! (Mwa-ha-ha!)
Так получается композиция.
8. Interfaces
Интерфейс это… интерфейс. Описание того,
что умеет делать тип.
Тип не обязан декларировать, что он
реализует какой-то интерфейс. Он его
просто реализует. Дела важнее слов!
9. Interfaces
А зачем интерфейсы?
А для полиморфизма!
Моему коду не нужно знать, как устроен
объект, достаточно того, что у него есть
нужные мне методы.
10. Как это сделать в Go?
package main
import “fmt”
type Sayer interface { Say() }
type Hello struct { Name string }
func (h Hello) Say() {
fmt.Println(h.Name)
}
type Bye struct { Hello }
func (b Bye) Say() {
fmt.Print(“Прощай, ”)
b.Hello.Say()
}
var (
h Hello
b Bye
)
func tell(s Sayer) {
s.Say()
}
func main () {
h.Name = “Как всегда...”
b.Name = “зарплата”
tell(h)
tell(b)
}
$ go run example.go
Как всегда...
Прощай, зарплата