SlideShare ist ein Scribd-Unternehmen logo
1 von 11
OOП в Go
Есть ли жизнь на Марсе?
Go -- объектно-ориентированный?
Нет. Но если сильно хочеться, то да:
● Есть типы и методы
● Нет иерархии типов (наследования)
● Зато есть интерфейсы (полиморфизм)
● Инкапсуляция (приватность, публичность)
● Композиция вместо наследования
Packages
Пакет -- это каталог с файлами, которые
начинаются с одной и той же
строки:package package_name
Близкий аналог -- namespace
Packages
Один пакет может содержать много кода:
определений типов, методов, функций.
Пакет -- это область видимости для
объявленных в нем типов, переменных,
функций, и т.д.
Packages
Все что определено как приватное в пакете -
- остается в пакете:
package my_secret_stuff
var (
myHiddenSecret string // Только мой пакет знает, что внутри
)
Код в пакете удобно структурировать по
файлам.
Structs
Структуры -- типы, похожие на структуры C.
Структура состоит из полей.
Может включать в себя другие структуры.
Structs
Структура, которая содержит в себе другую
структуру (или даже несколько), получает
всю ее силу! (Mwa-ha-ha!)
Так получается композиция.
Interfaces
Интерфейс это… интерфейс. Описание того,
что умеет делать тип.
Тип не обязан декларировать, что он
реализует какой-то интерфейс. Он его
просто реализует. Дела важнее слов!
Interfaces
А зачем интерфейсы?
А для полиморфизма!
Моему коду не нужно знать, как устроен
объект, достаточно того, что у него есть
нужные мне методы.
Как это сделать в 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
Как всегда...
Прощай, зарплата
Примерчик на гитхабчике
https://github.com/dmitry-vovk/go-oop-example/tree/master/src
Место для вашей рекламы
(063) 617-7393
dmitry.vovk@gmail.com

Weitere ähnliche Inhalte

Andere mochten auch

Go в автобусе
Go в автобусеGo в автобусе
Go в автобусеArtem Kovardin
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderIgor Dolzhikov
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runitAlexander Shcherbinin
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесAnton Piskunov
 
Как ВКонтакте использует Go
Как ВКонтакте использует GoКак ВКонтакте использует Go
Как ВКонтакте использует GoArtem Kovardin
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelAlex Mikitenko
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновAnton Piskunov
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Mikhail Salosin
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruAlexander Shcherbinin
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивамиEvgeny Smirnov
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsDaniel Podolsky
 
Machine Learning in Magento 2
Machine Learning in Magento 2Machine Learning in Magento 2
Machine Learning in Magento 2Alexander Makeev
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахAlex Chistyakov
 
Лямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюЛямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюAlexander Makeev
 
1. ruby великолепный. вступление история и философия
1. ruby великолепный. вступление   история и философия1. ruby великолепный. вступление   история и философия
1. ruby великолепный. вступление история и философияАлександр Вагин
 
Dynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsDynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsAlex Mikitenko
 

Andere mochten auch (20)

Go в автобусе
Go в автобусеGo в автобусе
Go в автобусе
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в Openprovider
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runit
 
Golang
GolangGolang
Golang
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
 
Как ВКонтакте использует Go
Как ВКонтакте использует GoКак ВКонтакте использует Go
Как ВКонтакте использует Go
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object model
 
Ruby строки
Ruby строкиRuby строки
Ruby строки
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демонов
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwords
 
Machine Learning in Magento 2
Machine Learning in Magento 2Machine Learning in Magento 2
Machine Learning in Magento 2
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектах
 
Лямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюЛямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связью
 
1. ruby великолепный. вступление история и философия
1. ruby великолепный. вступление   история и философия1. ruby великолепный. вступление   история и философия
1. ruby великолепный. вступление история и философия
 
Dynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsDynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friends
 

OOP в Go

  • 1. OOП в Go Есть ли жизнь на Марсе?
  • 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 Как всегда... Прощай, зарплата