Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Жизнь без generics
Search
Alexey Palazhchenko
July 24, 2014
Programming
290
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Жизнь без generics
Alexey Palazhchenko
July 24, 2014
More Decks by Alexey Palazhchenko
See All by Alexey Palazhchenko
Using PostgreSQL's Background Worker Processes For Fun and Profit
aleksi
0
220
Песнь Хорьков и Гоферов
aleksi
0
400
Fuzzy generics
aleksi
0
210
On Ferrets and Gophers
aleksi
0
310
How to Go Wrong with Concurrency
aleksi
2
830
Adding context to existing code
aleksi
1
190
Зачем и как написать свой database/sql драйвер
aleksi
1
230
Cooking gRPC
aleksi
1
950
Profiling and Optimizing Go Programs
aleksi
1
1.8k
Other Decks in Programming
See All in Programming
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
4.9k
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
340
AmebaブログはKMPから卒業します
kmars0605
0
310
AI-Powered Domain-Driven Design
ziobrando
0
360
LLM 101
dalinaum
0
360
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.4k
ActionController meets Protocol Buffers
sorah
1
750
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
190
パスワード再設定メールのURLについて知っておこう
uyuki234
0
200
No More NoSuchMethodError
exoego
1
120
Modernizing iOS Apps
seyfoyun
0
140
Groovy as a human and AI friendly programming language
paulk
0
140
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.6k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
The Curious Case for Waylosing
cassininazir
1
590
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
380
Automating Front-end Workflow
addyosmani
1370
210k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
820
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
550
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
What's in a price? How to price your products and services
michaelherold
247
13k
Git: the NoSQL Database
bkeepers
PRO
433
67k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
880
Between Models and Reality
mayunak
4
530
Transcript
Жизнь без generics
Radio-T #399 http://www.radio-t.com
Контейнеры m := make(map[string]int)! m["answer"] = 42! if len(m) >
0 {! ! delete(m, "answer")! }! ! func make(Type, size IntegerType) Type! func len(v Type) int! func delete(m map[Type]Type1, key Type)
Свои контейнеры type StringIntMapTS struct {! ! l sync.RWMutex! !
data map[string]int! }! ! func NewStringIntMapTS(cap int) *StringIntMapTS {! ! return &StringIntMapTS{! ! ! data: make(map[string]int, cap),! ! }! }! ! func (m *StringIntMapTS) Len() int {! ! m.l.RLock()! ! l := len(m.data)! ! m.l.RUnlock()! ! return l! }! ! func (m *StringIntMapTS) Get(key string) (v int, k bool) {! ! m.l.RLock()! ! value, ok = m.data[key]! ! m.l.RUnlock()! ! return! }
Свои контейнеры type MapTS struct {! ! l sync.RWMutex! !
data map[interface{}]interface{}! }! ! func NewMapTS(cap int) *MapTS {! ! return &MapTS{! ! ! data: make(map[interface{}]interface{}, cap),! ! }! }! ! func (m *MapTS) Len() int {! ! m.l.RLock()! ! l := len(m.data)! ! m.l.RUnlock()! ! return l! }! ! func (m *MapTS) Get(key interface{}) (v interface{}, k bool) {! ! m.l.RLock()! ! value, ok = m.data[key]! ! m.l.RUnlock()! ! return! }
Свои контейнеры • builtin’ы особенные: new, make, append, copy, delete,
len, cap, close • range
Итого 1. Свои контейнеры нужно писать руками для каждого типа,
или использовать interface{}
Функциональный подход type Thing struct {! ! F int! }!
! type Things []Thing! ! myThings := &Things{...}! myThings = Where(myThings, func(t *Thing) { t.F > 42 })! myThings = SortBy(myThings, func(a, b *Thing) bool { return a.F < b.F })
Наследование и полиморфизм class Base! {! public:! ! virtual void
F2() {! ! ! printf("Base::F2()\n");! ! ! this->F3();! ! }! ! virtual void F3() {! ! ! printf("Base::F3()\n");! ! }! };! ! class Derived : public Base! {! public:! ! virtual void F1() {! ! ! printf("Derived::F1()\n");! ! ! this->F2();! ! }! ! virtual void F3() {! ! ! printf("Derived::F3()\n");! ! }! };! ! int main()! {! ! (new Derived)->F1();! } type Base struct{}! ! func (this *Base) F2() {! ! println("Base::F2()")! ! this.F3()! }! ! func (this *Base) F3() {! ! println("Base::F3()")! }! ! type Derived struct {! ! Base! }! ! func (this *Derived) F1() {! ! println("Derived::F1()")! ! this.F2()! }! ! func (this *Derived) F3() {! ! println("Derived::F3()")! }! ! func main() {! ! new(Derived).F1()! }
Наследование и полиморфизм Derived::F1()! Base::F2()! Derived::F3() Derived::F1()! Base::F2()! Base::F3()
Итого 1. Свои контейнеры нужно писать руками для каждого типа,
или использовать interface{} 2. Полиморфизма нет
Полиморфизм type F3er interface {! ! F3()! }! ! type
Base struct {! ! F3er F3er! }! ! func (this *Base) F2() {! ! println("Base::F2()")! ! this.F3er.F3()! }! ! func (this *Base) F3() {! ! println("Base::F3()")! } type Derived struct {! ! Base! }! ! func (this *Derived) F1() {! ! println("Derived::F1()")! ! this.F2()! }! ! func (this *Derived) F3() {! ! println("Derived::F3()")! }! ! func main() {! ! d := new(Derived)! ! d.F3er = d! ! d.F1()! }
Полиморфизм type Interface interface {! ! Len() int! ! Less(i,
j int) bool! ! Swap(i, j int)! }! ! type ByAge []Person! func (a ByAge) Len() int { return len(a) }! func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }! func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }! ! sort.Sort(ByAge(people))
Итого 1. Свои контейнеры нужно писать руками для каждого типа,
или использовать interface{} 2. Полиморфизма нет
Функциональный подход func Merge(! a map[_typeKey_]_typeValue_,! b map[_typeKey_]_typeValue_)
Свои контейнеры type (! ! _typeKey_ string! ! _typeValue_ int!
)! ! type _TypeKey__TypeValue_MapTS struct {! ! l sync.RWMutex! ! data map[_typeKey_]_typeValue_! }! ! func New_TypeKey__TypeValue_MapTS(cap int) *_TypeKey__TypeValue_MapTS {! ! return &_TypeKey__TypeValue_MapTS{! ! ! data: make(map[_typeKey_]_typeValue_, cap),! ! }! }
Свои контейнеры type StringIntMapTS struct {! ! l sync.RWMutex! !
data map[string]int! }! ! func NewStringIntMapTS(cap int) *StringIntMapTS {! ! return &StringIntMapTS{! ! ! data: make(map[string]int, cap),! ! }! }
gogen https://github.com/AlekSi/gogen! https://github.com/AlekSi/gogen-library
Итого 1. Свои контейнеры нужно писать руками для каждого типа,
или использовать interface{} 2. Полиморфизма нет
! ! ! ! ! ! https://github.com/AlekSi/gogen! https://github.com/AlekSi/gogen-library