SlideShare uma empresa Scribd logo
1 de 31
Wonders of Golang
Pain points of Systems Software
Change in computing landscape
Scale of development
Developer productivity
Dependency management
Enter Go
A new language,a concurrent, garbage-collected languagewith
fast compilation.
Syntax and Semantics
Similar to C
• compiled
• Statically typed
• Procedural with pointers
Small changes to C semantics
• No Pointer arithmetic
• No implicit numeric conversions
• Array bounds are always checked
Big changes
• Linguistic support for Concurrency
• Garbage collection
• Interface, reflection, type switches, etc.
Packages
• Modularity and reusability
• Componentize software
• Import clause
– import “fmt”
• Package name is used to qualify items
– Name vs. pkg.Name
• Remote packages
– import "github.com/garyburd/redigo"
Defining visibility using Naming
• Name of the identifier itself carries the visibility
– Upper case initial letter: Public/ exported/ visible to
other packages
– Lower case initial letter: Private to the package
Concurrency
• Do not communicate by sharing memory;
instead, share memory by communicating.
Goroutine
• Function executing concurrently with others in
same address space
• Lightweight
• Multiplexed into multiple OS threads
• Go keyword
Channels
• way for two goroutines to communicate with
one another and synchronize their execution
• By default, sends and receives block until the
other side is ready.
• Combine communication and synchronization
• Buffered channels
Channel
http://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html
Buffered channel
Channel Idioms
• A channel can allow the launching goroutine
to wait for the sort to complete.
Server throughput
Request serving architectures
Cost of scheduling OS threads
• POSIX Threads: Signal mask, CPU affinity,
cgroups
• Store all the CPU registers
• Cost of context switch Vs amount of work
Goroutine scheduling
• Switched happen only at predefined times
– If channel operations are blocking
– Go statement
– Blocking syscalls like file and network IO
– Garbage collection
• Compiler knows which registers are used
Stack management
POSIX threads
• Large amount of
memory pre-reserved
• Amount of available
memory reduces with
increase in threads
Goroutine
• Starts with 2k
• A check before a
function call
• Shrinks with GC
OOP
Struct
Embedding
Multiple embedding
A golang-Interface is a class, with NO fields, and ALL VIRTUAL methods
When you call a method on the var/parameter, a concrete method is
called via method dispatch from a jmp-table.
Interface
Standard library
• Exp package for experimental new packages
• Archive and compresion: read .tar and .zip
• Bytes and String
• Collections: heap, lists
• File, OS
• Maths
• Networking: UNIX domain and network
sockets, TCP/IP, and UDP
Tools
• Gofmt: single style for readability and
scalability
• Golint: checks style violations
• GoVet: finding common mistakes
• Inbuilt performance profiler
Golang @ PubMatic
• Low latency high throughput
• Large number of network IO to external
partners
• Billions of requests per day
• Multiple go services live
• Third party components such as redis,
Aerospike, MySQL, GeoIP
We are hiring!
http://www.pubmatic.com/careers.php
GOPHERCON
• The Go Conference in India
• 19 - 20 February 2016
• Vivanta by Taj, MG Road, Bengaluru
• http://www.gophercon.in/
• Ticket is Rs 3999 (last 60 tickets remaining)
• Discount code D1000 for Rs 1000 off!
• https://www.townscript.com/e/gci16

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Optimizing and Profiling Golang Rest Api
Optimizing and Profiling Golang Rest ApiOptimizing and Profiling Golang Rest Api
Optimizing and Profiling Golang Rest Api
 
Mphasis Digital - Use Go (gloang) for system programming, distributed systems...
Mphasis Digital - Use Go (gloang) for system programming, distributed systems...Mphasis Digital - Use Go (gloang) for system programming, distributed systems...
Mphasis Digital - Use Go (gloang) for system programming, distributed systems...
 
An introduction to go programming language
An introduction to go programming languageAn introduction to go programming language
An introduction to go programming language
 
Go language presentation
Go language presentationGo language presentation
Go language presentation
 
Coding with golang
Coding with golangCoding with golang
Coding with golang
 
A First Look at Google's Go Programming Language
A First Look at Google's Go Programming LanguageA First Look at Google's Go Programming Language
A First Look at Google's Go Programming Language
 
Golang for OO Programmers
Golang for OO ProgrammersGolang for OO Programmers
Golang for OO Programmers
 
10 reasons to be excited about go
10 reasons to be excited about go10 reasons to be excited about go
10 reasons to be excited about go
 
Building Command Line Tools with Golang
Building Command Line Tools with GolangBuilding Command Line Tools with Golang
Building Command Line Tools with Golang
 
kikstart journey of Golang with Hello world - Gopherlabs
kikstart journey of Golang with Hello world - Gopherlabs kikstart journey of Golang with Hello world - Gopherlabs
kikstart journey of Golang with Hello world - Gopherlabs
 
Go Programming Language by Google
Go Programming Language by GoogleGo Programming Language by Google
Go Programming Language by Google
 
Go Lang
Go LangGo Lang
Go Lang
 
Golang online course
Golang online courseGolang online course
Golang online course
 
Understanding how concurrency work in os
Understanding how concurrency work in osUnderstanding how concurrency work in os
Understanding how concurrency work in os
 
The Go programming language - Intro by MyLittleAdventure
The Go programming language - Intro by MyLittleAdventureThe Go programming language - Intro by MyLittleAdventure
The Go programming language - Intro by MyLittleAdventure
 
Introduction to go lang
Introduction to go langIntroduction to go lang
Introduction to go lang
 
[INNOVATUBE] Tech Talk #3: Golang - Takaaki Mizuno
 [INNOVATUBE] Tech Talk #3: Golang - Takaaki Mizuno [INNOVATUBE] Tech Talk #3: Golang - Takaaki Mizuno
[INNOVATUBE] Tech Talk #3: Golang - Takaaki Mizuno
 
Go Programming language, golang
Go Programming language, golangGo Programming language, golang
Go Programming language, golang
 
How to write a well-behaved Python command line application
How to write a well-behaved Python command line applicationHow to write a well-behaved Python command line application
How to write a well-behaved Python command line application
 
GO programming language
GO programming languageGO programming language
GO programming language
 

Semelhante a Wonders of Golang

Semelhante a Wonders of Golang (20)

Go: What's Different ?
Go: What's Different ?Go: What's Different ?
Go: What's Different ?
 
High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014
 
Making Wallstreet talk with GO (GO India Conference 2015)
Making Wallstreet talk with GO (GO India Conference 2015)Making Wallstreet talk with GO (GO India Conference 2015)
Making Wallstreet talk with GO (GO India Conference 2015)
 
Enter Cookbook: refactoring under a microscope
Enter Cookbook: refactoring under a microscopeEnter Cookbook: refactoring under a microscope
Enter Cookbook: refactoring under a microscope
 
Protocol Buffers
Protocol BuffersProtocol Buffers
Protocol Buffers
 
Don’t turn your logs into cuneiform
Don’t turn your logs into cuneiformDon’t turn your logs into cuneiform
Don’t turn your logs into cuneiform
 
"Building Modern PHP Applications" - Jackson Murtha, South Dakota Code Camp 2012
"Building Modern PHP Applications" - Jackson Murtha, South Dakota Code Camp 2012"Building Modern PHP Applications" - Jackson Murtha, South Dakota Code Camp 2012
"Building Modern PHP Applications" - Jackson Murtha, South Dakota Code Camp 2012
 
Reading Notes : the practice of programming
Reading Notes : the practice of programmingReading Notes : the practice of programming
Reading Notes : the practice of programming
 
Python VS GO
Python VS GOPython VS GO
Python VS GO
 
Go at Skroutz
Go at SkroutzGo at Skroutz
Go at Skroutz
 
Managing Open Source Software in the GitHub Era
Managing Open Source Software in the GitHub EraManaging Open Source Software in the GitHub Era
Managing Open Source Software in the GitHub Era
 
computer-science_engineering_principles-of-programming-languages_introduction...
computer-science_engineering_principles-of-programming-languages_introduction...computer-science_engineering_principles-of-programming-languages_introduction...
computer-science_engineering_principles-of-programming-languages_introduction...
 
Open Source SQL Databases
Open Source SQL DatabasesOpen Source SQL Databases
Open Source SQL Databases
 
Rest style web services (google protocol buffers) prasad nirantar
Rest style web services (google protocol buffers)   prasad nirantarRest style web services (google protocol buffers)   prasad nirantar
Rest style web services (google protocol buffers) prasad nirantar
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and Abstractions
 
LCA14: LCA14-209: ODP Project Update
LCA14: LCA14-209: ODP Project UpdateLCA14: LCA14-209: ODP Project Update
LCA14: LCA14-209: ODP Project Update
 
EuroMPI 2013 presentation: McMPI
EuroMPI 2013 presentation: McMPIEuroMPI 2013 presentation: McMPI
EuroMPI 2013 presentation: McMPI
 
Introduction to Python Programming
Introduction to Python ProgrammingIntroduction to Python Programming
Introduction to Python Programming
 
MPI n OpenMP
MPI n OpenMPMPI n OpenMP
MPI n OpenMP
 
Getting Started with Go
Getting Started with GoGetting Started with Go
Getting Started with Go
 

Último

introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 

Último (20)

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions Presentation
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 

Wonders of Golang

  • 2. Pain points of Systems Software Change in computing landscape Scale of development Developer productivity Dependency management
  • 3.
  • 4.
  • 5. Enter Go A new language,a concurrent, garbage-collected languagewith fast compilation.
  • 6. Syntax and Semantics Similar to C • compiled • Statically typed • Procedural with pointers Small changes to C semantics • No Pointer arithmetic • No implicit numeric conversions • Array bounds are always checked Big changes • Linguistic support for Concurrency • Garbage collection • Interface, reflection, type switches, etc.
  • 7. Packages • Modularity and reusability • Componentize software • Import clause – import “fmt” • Package name is used to qualify items – Name vs. pkg.Name • Remote packages – import "github.com/garyburd/redigo"
  • 8. Defining visibility using Naming • Name of the identifier itself carries the visibility – Upper case initial letter: Public/ exported/ visible to other packages – Lower case initial letter: Private to the package
  • 9. Concurrency • Do not communicate by sharing memory; instead, share memory by communicating.
  • 10. Goroutine • Function executing concurrently with others in same address space • Lightweight • Multiplexed into multiple OS threads • Go keyword
  • 11. Channels • way for two goroutines to communicate with one another and synchronize their execution • By default, sends and receives block until the other side is ready. • Combine communication and synchronization • Buffered channels
  • 14. Channel Idioms • A channel can allow the launching goroutine to wait for the sort to complete.
  • 17. Cost of scheduling OS threads • POSIX Threads: Signal mask, CPU affinity, cgroups • Store all the CPU registers • Cost of context switch Vs amount of work
  • 18. Goroutine scheduling • Switched happen only at predefined times – If channel operations are blocking – Go statement – Blocking syscalls like file and network IO – Garbage collection • Compiler knows which registers are used
  • 19. Stack management POSIX threads • Large amount of memory pre-reserved • Amount of available memory reduces with increase in threads Goroutine • Starts with 2k • A check before a function call • Shrinks with GC
  • 20. OOP
  • 24. A golang-Interface is a class, with NO fields, and ALL VIRTUAL methods When you call a method on the var/parameter, a concrete method is called via method dispatch from a jmp-table. Interface
  • 25. Standard library • Exp package for experimental new packages • Archive and compresion: read .tar and .zip • Bytes and String • Collections: heap, lists • File, OS • Maths • Networking: UNIX domain and network sockets, TCP/IP, and UDP
  • 26.
  • 27. Tools • Gofmt: single style for readability and scalability • Golint: checks style violations • GoVet: finding common mistakes • Inbuilt performance profiler
  • 28.
  • 29. Golang @ PubMatic • Low latency high throughput • Large number of network IO to external partners • Billions of requests per day • Multiple go services live • Third party components such as redis, Aerospike, MySQL, GeoIP
  • 31. GOPHERCON • The Go Conference in India • 19 - 20 February 2016 • Vivanta by Taj, MG Road, Bengaluru • http://www.gophercon.in/ • Ticket is Rs 3999 (last 60 tickets remaining) • Discount code D1000 for Rs 1000 off! • https://www.townscript.com/e/gci16

Notas do Editor

  1. Most of the popular languages used for systems development, such as C C++ Java have been created for an environment which has changed a lot in the last few years. The problems introduced by multicore processors, networked systems, massive computation clusters, and the web programming model were being worked around rather than addressed head-on. Fundamental concepts such as garbage collection and parallel computation were not supported by popular languages. The scale has changed: today's server programs comprise tens of millions of lines of code, are worked on by hundreds or even thousands of programmers, and are updated literally every day. To make matters worse, build times, even on large compilation clusters, have stretched to many minutes, even hours. Lot of developers are early in their careers and are used to procedural languages. It takes lot of time and effort to become productive in a language. People are used to languages such as C C++ Java and Java Script. Each programmer uses a subset of the language. Poor program understanding (code hard to read, poorly documented) Duplication of efforts: Lack of standard library support for commonly used data strcutures, networking and other routinely used algorithms results in duplication of efforts in implementing them. Dependency management is important for clean dependency analysis—and fast compilation. “header files” of languages in the C tradition #ifndef guards: Idea is that header file is bracked with the conditional compilation clause, so that the file can be included multiple times without error. Source of unix ps command has stat.h included 37 times. Even if the contents are discarded, the file is opened, read and scanned 37 times. One interesting data point from Google: The code of a google binary concatenated together, was around 4.2 MB. By the time the #inlcude had been expanded, it blew over to 8GB as input to the compiler, that is a massive 2000x blowup. Another data point: Google updated their build system from a single makefile, to a per-directory design with more clear dependencies. The binary shrunk by 40% just by clear dependencies. The consequence of uncontrolled dependencies is that Google has to maintain a distributed compilation system costing huge engineering effort.
  2. Requirements for a language to succeed in the systems development environment: It must work at scale, for large programs with large numbers of dependencies, with large teams of programmers working on them. It must be familiar, roughly C-like. The need to get programmers productive quickly in a new language means that the language cannot be too radical. It must be modern. There are features of the modern world that are better met by newer approaches, such as built-in concurrency. Regarding the points above: It is possible to compile a large Go program in a few seconds on a single computer. Go makes dependency analysis easy and avoids much of the overhead of C-style include files and libraries. Type system has no hierarchy Go is fully garbage-collected and provides fundamental support for concurrent execution and communication. Go supports the construction of system software on multicore machines. It is common to have thousands of goroutines on a moderately sized server
  3. syntax determines the readability and hence clarity of the language. Also, syntax is critical to tooling: if the language is hard to parse, automated tools are hard to write. Go was therefore designed with clarity and tooling in mind, and has a clean syntax. the grammar is regular and therefore easy to parse
  4. Go provides the modularity and code reusability through it’s package ecosystem write small pieces of software components through packages, and compose your  applications with these small packages. the package path can refer to remote repositories by having it identify the URL of the site serving the repository.
  5. it's always clear when looking at an identifier whether it is part of the public API. After using Go for a while, it feels burdensome when going back to other languages that require looking up the declaration to discover this information
  6. Concurrent programming in many environments is made difficult by the subtleties required to implement correct access to shared variables Go encourages a different approach in which shared values are passed around on channels Only one goroutine has access to the vaue at any given time. Data races cannot occur, by design
  7. Goroutines are multiplexed onto multiple OS threads so if one should block, such as while waiting for I/O, others continue to run. Their design hides many of the complexities of thread creation and management.
  8. By default, sends and receives block until the other side is ready. This allows goroutines to synchronize without explicit locks or condition variables. If the channel has a buffer, the sender blocks only until the value has been copied to the buffer; if the buffer is full, this means blocking until some receiver has retrieved a value. A buffered channel can be used like a semaphore, for instance to limit throughput.
  9. The throughput of a server follows a bell curve, as shown in the figure After the peak output, the server starts spending more time scheduling the requests, rather than serving the requests, resulting into increasing number of timeouts and errors
  10. Thread per request: The bottleneck of low latency high scale systems is the number of threads handled by the OS (not RAM, CPU, Bandwidth). The code is simple to develop and debug. Either go for event based model or lightweight threads Event-based programming has been highly touted in recent years as the best way to write highly concurrent applications. Event based systems are promising but it has a steep learning curve and dependent complexities.
  11. Threads have their own signal mask, can be assigned CPU affinity, can be put into cgroups and can be queried for which resources they use. All these controls add overhead for they quickly add up when you have 100,000 threads in your program. The kernel needs to store the contents of all the CPU registers for that process, then restore the values for another process. Because a process switch can occur at any point in a process’ execution, the operating system needs to store the contents of all of these registers because it does not know which are currently in use 2. The kernel needs to flush the CPU’s virtual address to physical address mappings (TLB cache) These costs are relatively fixed by the hardware, and depend on the amount of work done between context switches to amortise their cost—rapid context switching tends to overwhelm the amount of work done between context switches.
  12. Instead of using guard pages, the Go compiler inserts a check as part of every function call to test if there is sufficient stack for the function to run. If there is sufficient stack space, the function runs as normal. If there is insufficient space, the runtime will allocate a larger stack segment on the heap, copy the contents of the current stack to the new segment, free the old segment, and the function call is restarted. Because of this check, a goroutine’s initial stack can be made much smaller, which in turn permits Go programmers to treat goroutines as cheap resources. Goroutine stacks can also shrink if a sufficient portion remains unused. This is handled during garbage collection
  13. By embedding a struct into another you have a mechanism similar to multiple inheritance After embedding, the base fields and methods are directly available in the derived struct
  14. If you have a method show() for example in class/struct NamedObj and also define a method show() in class/struct Rectangle, Rectangle/show() will SHADOW the parent's class NamedObj/Show() Golang solves the diamond problem by not allowing diamonds.
  15. The exp (experimental) package is where packages that might potentially be added to the standard library begin life, so these packages should not be used unless you want to participate in their development (by testing, commenting, or submitting patches). T
  16. Go's syntax, package system, naming conventions, and other features were designed to make tools easy to write, and the library includes a lexer, parser, and type checker for the language.