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
200
DevOoops Mastery
bryanl
0
74
The (Ruby) Sims
bryanl
1
140
How Vs Why
bryanl
0
130
ruby -pi -e.bak - Windy City Rails
bryanl
1
280
Arrrr Camp 2012: Simulating the World with Ruby
bryanl
2
520
Other Decks in Programming
See All in Programming
Design Foundational Data Engineering Observability
sucitw
3
190
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
440
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
110
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
140
Vue・React マルチプロダクト開発を支える Vite
andpad
0
110
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
0
400
Namespace and Its Future
tagomoris
6
700
Cache Me If You Can
ryunen344
2
630
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
120
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.2k
旅行プランAIエージェント開発の裏側
ippo012
2
890
私の後悔をAWS DMSで解決した話
hiramax
4
210
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Practical Orchestrator
shlominoach
190
11k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
A Tale of Four Properties
chriscoyier
160
23k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Fireside Chat
paigeccino
39
3.6k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Writing Fast Ruby
sferik
628
62k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
51
5.6k
Rails Girls Zürich Keynote
gr2m
95
14k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
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.