Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go At Work
Search
Bryan Liles
December 18, 2014
Programming
0
230
Go At Work
You know how to program Go. How do you program Go at work?
Bryan Liles
December 18, 2014
Tweet
Share
More Decks by Bryan Liles
See All by Bryan Liles
DevOps Days MSP 2017
bryanl
2
1.1k
Velocity 2017 SJ: Application Tracing
bryanl
2
360
Application Ops 1.0
bryanl
1
190
DevOoops Mastery
bryanl
0
70
The (Ruby) Sims
bryanl
1
130
How Vs Why
bryanl
0
130
ruby -pi -e.bak - Windy City Rails
bryanl
1
270
Arrrr Camp 2012: Simulating the World with Ruby
bryanl
2
510
Other Decks in Programming
See All in Programming
Webの外へ飛び出せ NativePHPが切り拓くPHPの未来
takuyakatsusa
1
150
Haskell でアルゴリズムを抽象化する / 関数型言語で競技プログラミング
naoya
17
4.8k
Using AI Tools Around Software Development
inouehi
0
1.2k
Create a website using Spatial Web
akkeylab
0
290
Claude Codeの使い方
ttnyt8701
1
130
型付きアクターモデルがもたらす分散シミュレーションの未来
piyo7
0
800
Javaに鉄道指向プログラミング (Railway Oriented Pro gramming) のエッセンスを取り入れる/Bringing the Essence of Railway-Oriented Programming to Java
cocet33000
2
580
C++20 射影変換
faithandbrave
0
500
コード書くの好きな人向けAIコーディング活用tips #orestudy
77web
3
320
Go1.25からのGOMAXPROCS
kuro_kurorrr
1
780
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
380
GoのWebAssembly活用パターン紹介
syumai
3
10k
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
4 Signs Your Business is Dying
shpigford
184
22k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
Facilitating Awesome Meetings
lara
54
6.4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
GraphQLとの向き合い方2022年版
quramy
46
14k
Gamification - CAS2011
davidbonilla
81
5.3k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
A better future with KSS
kneath
239
17k
How to Ace a Technical Interview
jacobian
277
23k
Transcript
digitalocean.com Go At Work
digitalocean.com Go At DigitalOcean
digitalocean.com Bryan Liles @bryanl @digitalocean
digitalocean.com Wow GO!
digitalocean.com
digitalocean.com Dependencies :|
digitalocean.com package main import "github.com/go-martini/martini" func main() { m :=
martini.Classic() m.Get("/", func() string { return "Hello world!" }) m.Run() }
digitalocean.com package main import ( "fmt" "net/http" "github.com/codegangsta/negroni" ) func
main() { mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "Hello world!") }) n := negroni.Classic() n.UseHandler(mux) n.Run(":3000") }
digitalocean.com package main import ( "fmt" "net/http" ) func handler(w
http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello world!") } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":3000", nil) }
digitalocean.com package main import ( "fmt" "net/http" "github.com/gorilla/mux" ) func
main() { r := mux.NewRouter() r.HandleFunc("/", homeHandler) http.Handle("/", r) http.ListenAndServe(":3000", nil) } func homeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello world!") }
digitalocean.com “You wouldn’t go around picking stuff off the street
and eating it. Why do so with your dependencies?”
digitalocean.com Fancy Stuff Standard Lib
digitalocean.com Standard Lib Fancy Stuff
digitalocean.com Standard Lib Fancy Stuff
digitalocean.com Fancy Stuff Standard Lib
digitalocean.com Managing the GOPATH
digitalocean.com There’s more than one way to do it.
digitalocean.com single GOPATH
digitalocean.com GOPATH for each project
digitalocean.com Dependency manager
digitalocean.com Go @digitalocean
digitalocean.com single GOPATH
digitalocean.com a DOGE
digitalocean.com vendor repos import "bits.do.co/vendor/cli"
digitalocean.com Beyond gofmt
digitalocean.com Sometimes the default sorting of your imports just doesn’t
satisfy…
digitalocean.com import ( "database/sql" "doge/log" "doge/notify" "fmt" "os" "services/migration" "time"
_ "github.com/go-sql-driver/mysql" "github.com/ianschenck/envflag" )
digitalocean.com import ( "database/sql" "fmt" "os" "time" "doge/log" "doge/notify" "services/migration"
_ "github.com/go-sql-driver/mysql" "github.com/ianschenck/envflag" )
digitalocean.com http://golang.org/pkg/go/parser/ (and friends)
digitalocean.com Test the GO
digitalocean.com You are writing tests, right?
digitalocean.com func TestSquare(t *testing.T) { expected := 25 got :=
square(5) if got != expected { t.Errorf("expected %d, got %d", expected, got) } }
digitalocean.com undefined: square
digitalocean.com func square(x int) int { return 0 }
digitalocean.com --- FAIL: TestSquare (0.00 seconds) square_test.go:14: expected 25, got
0 FAIL
digitalocean.com func square(x int) int { return 25 }
digitalocean.com $ go test . ok _/Users/bryan/gothamgo2014 0.005s
digitalocean.com func TestSquare0(t *testing.T) { expected := 0 got :=
square(0) if got != expected { t.Errorf("expected %d, got %d", expected, got) } }
digitalocean.com --- FAIL: TestSquare0 (0.00 seconds) square_test.go:23: expected 0, got
25 FAIL
digitalocean.com func square(x int) int { return x * x
}
digitalocean.com go test . ok _/Users/bryan/gothamgo2014 0.006s
digitalocean.com func TestSquare(t *testing.T) { cases := []struct { arg
int expected int }{ {5, 25}, {0, 0}, {-1, 1}, } for i, c := range cases { got := square(c.arg) if got != c.expected { t.Errorf("case %d: expected %d, got %d", i, c.expected, got) } } }
digitalocean.com looper https://github.com/nathany/looper
digitalocean.com
digitalocean.com GoConvey http://goconvey.co/
digitalocean.com
digitalocean.com • 10 things you (probably) don't know about Go
• Testing Techniques
digitalocean.com Code Reviews
digitalocean.com https://code.google.com/p/go-wiki/wiki/CodeReviewComments Start here
digitalocean.com WHY > HOW
digitalocean.com Continuous Integration
digitalocean.com Drone CI
digitalocean.com We ❤️ Artifacts
digitalocean.com Deploying GO
digitalocean.com Little Deploys = ansible
digitalocean.com Big Deploys = Chef
digitalocean.com
digitalocean.com The End.