The
Go
Workshop

Built by a team of experts to help you unlock your next promotion, reboot your career, or kick off your latest side project.

Get Started Today

You'll be up and running with Go in no time at all.

  • Free

    FreeThe Go Workshop

    Unlock one year of full, unlimited access and get started right away!
    Learn for Free

Engineered for Success

Nobody likes going through hundreds of pages of dry theory, or struggling with uninteresting examples that don’t compile. We've got you covered. Any time, any device.

  • Learn by doing real-world development, supported by detailed step-by-step examples, screencasts and knowledge checks.

  • Become a verified practitioner, building your credentials by completing exercises, activities and assessment checks.

  • Manage your learning based on your personal schedule, with content structured to easily let you pause and progress at will.

Learn By Doing

You already know you want to learn Go, and a smarter way to learn Go is to learn by doing.

The Go Workshop focuses on building up your practical skills so that you can develop high-performing concurrent applications, or even create Go scripts to automate repetitive daily tasks. You'll learn from real examples that lead to real results.

On Your Terms

Build up and reinforce key skills in a way that feels rewarding.

You won't have to sit through any unnecessary theory. If you're short on time you can jump into a single exercise each day or spend an entire weekend learning about third-party libraries. It's your choice.

An Ideal Start

Fast-paced and direct, The Go Workshop is the ideal companion for Go beginners.

You'll build and iterate on your code like a software developer, learning along the way. This process means that you'll find that your new skills stick, embedded as best practice. A solid foundation for the years ahead.

Begin Your Journey

A simple, straightforward and pain-free way to learn Go.

  • Free

    FreeThe Go Workshop

    Unlock one year of full, unlimited access and get started right away!
    Buy Now

Everything You Need

Every Workshop includes access to dedicated support, course discussions and a wider learning community. Ask questions, share answers and work with the community to expand your learning.

  • Engage and participate in live user discussions, baked right into your course from start to finish. Share, learn and grow together.

  • Get live updates and interact directly with the product development, editorial and authoring teams across the Packt network.

  • Create, showcase and share your own learning outcomes and motivational stories across the entire workshop community.

Get Build-Ready

Every Workshop includes a whole host of features that work together to help you get the job done. You’ll be ready to tackle real-world development in no time.
  • Hack Your Brain

    We've applied the latest pedagogical techniques to deliver a truly multimodal experience. It'll keep you engaged and make the learning stick. It's science!

  • Build Real Things

    Nobody likes wasting their time. We cut right to the action and get you building real skills that real, working developers value. The perfect approach for a career move.

  • Learn From Experts

    We've paired technical experts with top editorial talent. They've worked hard to deliver you the maximum impact for each minute you spend learning. It's our secret sauce.

  • Verify Your Credentials

    You can become a verified practitioner. Complete the course to get a certificate. It's perfect for sharing on social media. Hello LinkedIn!

  • Receive Free Updates

    Technology keeps changing, and so do we. We keep versions updated independently, so you'll always have access. No more worrying about third-party release cycles.

  • Access Anywhere

    All you need is an internet connection. We've built every course so that it works on desktop and mobile, giving you options that fit within your schedule.

What's Inside

From A to Z, we've got you covered!

  • Introduction and Setup

    • Welcome to The Go Workshop
    • Installation and Setup
    • Credits
  • 1. Variables and Operators

    • Overview
    • What is Go?
    • Exercise 1.01: Using Variables, Packages, and Functions to Print Stars
    • Exercise 1.01: Using Variables, Packages, and Functions to Print Stars
    • Activity 1.01: Defining and Printing
    • Exercise 1.02: Declaring a Variable Using var
    • Exercise 1.02: Declaring a Variable Using var
    • Exercise 1.03: Declaring Multiple Variables at Once with var
    • Exercise 1.03: Declaring Multiple Variables at Once with var
    • Exercise 1.04: Skipping the Type or Value When Declaring Variables
    • Exercise 1.04: Skipping the Type or Value When Declaring Variables
    • Type Inference Gone Wrong
    • Exercise 1.05: Implementing Short Variable Declaration
    • Exercise 1.05: Implementing Short Variable Declaration
    • Exercise 1.06: Declaring Multiple Variables from a Function
    • Exercise 1.06: Declaring Multiple Variables from a Function
    • Using var to Declare Multiple Variables in One Line
    • Exercise 1.07: Changing the Value of a Variable
    • Exercise 1.07: Changing the Value of a Variable
    • Exercise 1.08: Changing Multiple Values at Once
    • Exercise 1.08: Changing Multiple Values at Once
    • Exercise 1.09 Using Operators with Numbers
    • Exercise 1.09 Using Operators with Numbers
    • Exercise 1.10: Implementing Shorthand Operators
    • Exercise 1.10: Implementing Shorthand Operators
    • Exercise 1.11: Comparing Values
    • Exercise 1.11: Comparing Values
    • Exercise 1.12: Zero Values
    • Exercise 1.12: Zero Values
    • Exercise 1.13: Getting a Pointer
    • Exercise 1.13: Getting a Pointer
    • Exercise 1.14: Getting a Value from a Pointer
    • Exercise 1.14: Getting a Value from a Pointer
    • Exercise 1.15: Function Design with Pointers
    • Exercise 1.15: Function Design with Pointers
    • Activity 1.02: Pointer Value Swap
    • Exercise 1.16: Constants
    • Exercise 1.16: Constants
    • Enums
    • Activity 1.03: Message Bug
    • Activity 1.04: Bad Count Bug
    • Summary
  • 2. Logic and Loops

    • Overview
    • Exercise 2.01: A Simple if Statement
    • Exercise 2.01: A Simple if Statement
    • Exercise 2.02: Using an if else Statement
    • Exercise 2.02: Using an if else Statement
    • Exercise 2.03: Using an else if Statement
    • Exercise 2.03: Using an else if Statement
    • Exercise 2.04: Implementing the Initial if Statements
    • Exercise 2.04: Implementing the Initial if Statements
    • Activity 2.01: Implementing FizzBuzz
    • Exercise 2.05: Using a switch Statement
    • Exercise 2.05: Using a switch Statement
    • Exercise 2.06: switch Statements and Multiple case Values
    • Exercise 2.06: switch Statements and Multiple case Values
    • Exercise 2.07: Expressionless switch Statements
    • Exercise 2.07: Expressionless switch Statements
    • Exercise 2.08: Using the for i Loop
    • Exercise 2.08: The for i Loop
    • Exercise 2.09: Looping Over Arrays and Slices
    • Exercise 2.09: Looping Over Arrays and Slices
    • Exercise 2.10: Looping Over a Map
    • Exercise 2.10: Looping Over a Map
    • Activity 2.02: Looping Over Map Data Using range
    • Exercise 2.11: Using break and continue to Control Loops
    • Exercise 2.11: Using break and continue to Control Loops
    • Activity 2.03: Bubble Sort
    • Summary
  • 3. Core Types

    • Overview
    • Exercise 3.01: Program to Measure Password Complexity
    • Exercise 3.01: Program to Measure Password Complexity
    • Numbers
    • Exercise 3.02: Floating-Point Number Accuracy
    • Exercise 3.02: Floating-Point Number Accuracy
    • Exercise 3.03: Triggering Number Wraparound
    • Exercise 3.03: Triggering Number Wraparound
    • Exercise 3.04: Big Numbers
    • Exercise 3.04: Big Numbers
    • Byte
    • Exercise 3.05: Safely Looping over a String
    • Exercise 3.05: Safely Looping over a String
    • The nil value
    • Activity 3.01: Sales Tax Calculator
    • Activity 3.02: Loan Calculator
    • Summary
  • 4. Complex Types

    • Overview
    • Collection Types
    • Exercise 4.01: Defining an Array
    • Exercise 4.01: Defining an Array
    • Exercise 4.02: Comparing Arrays
    • Exercise 4.02: Comparing Arrays
    • Exercise 4.03: Initializing an Array Using Keys
    • Exercise 4.03: Initializing an Array Using Keys
    • Exercise 4.04: Reading a Single Item from an Array
    • Exercise 4.04: Reading a Single Item from an Array
    • Exercise 4.05: Writing to an Array
    • Exercise 4.05: Writing to an Array
    • Exercise 4.06: Looping Over an Array Using a "for i" Loop
    • Exercise 4.06: Looping Over an Array Using a "for i" Loop
    • Exercise 4.07: Modifying the Contents of an Array in a Loop
    • Exercise 4.07: Modifying the Contents of an Array in a Loop
    • Activity 4.01: Filling an Array
    • Exercise 4.08: Working with Slices
    • Exercise 4.08: Working with Slices
    • Activity 4.02: Printing a User's Name Based on User Input
    • Exercise 4.09: Appending Multiple Items to a Slice
    • Exercise 4.09: Appending Multiple Items to a Slice
    • Activity 4.03: Creating a Locale Checker
    • Exercise 4.10: Creating Slices from a Slice
    • Exercise 4.10: Creating Slices from a Slice
    • Exercise 4.11: Using make to Control the Capacity of a Slice
    • Exercise 4.11: Using make to Control the Capacity of a Slice
    • Exercise 4.12: Controlling Internal Slice Behavior
    • Exercise 4.12: Controlling Internal Slice Behavior
    • Exercise 4.13: Creating, Reading, and Writing a Map
    • Exercise 4.13: Creating, Reading, and Writing a Map
    • Exercise 4.14: Reading from a Map
    • Exercise 4.14: Reading from a Map
    • Activity 4.04: Slicing the Week
    • Exercise 4.15: Deleting an Element from a Map
    • Exercise 4.15: Deleting an Element from a Map
    • Activity 4.05: Removing an Element from a Slice
    • Exercise 4.16: Creating a Simple Custom Type
    • Exercise 4.16: Creating a Simple Custom Type
    • Exercise 4.17: Creating Struct Types and Values
    • Exercise 4.17: Creating Struct Types and Values
    • Exercise 4.18: Comparing Structs to Each Other
    • Exercise 4.18: Comparing Structs to Each Other
    • Exercise 4.19: Struct Embedding and Initialization
    • Exercise 4.19: Struct Embedding and Initialization
    • Exercise 4.20: Numeric Type Conversion
    • Exercise 4.20: Numeric Type Conversion
    • Exercise 4.21: Type Assertion
    • Exercise 4.21: Type Assertion
    • Exercise 4.22: Type Switch
    • Exercise 4.22: Type Switch
    • Activity 4.06: Type Checker
    • Summary
    • Survey 1
  • 5. Functions

    • Overview
    • Functions
    • fizzBuzz
    • Exercise 5.01: Creating a Function to Print Salesperson Expectation Ratings from the Number of Items Sold
    • Exercise 5.01: Creating a Function to Print Salesperson Expectation Ratings from the Number of Items Sold
    • Parameters
    • Exercise 5.02: Mapping Index Values to Column Headers
    • Exercise 5.02: Mapping Index Values to Column Headers
    • Exercise 5.03: Creating a fizzBuzz Function with Return Values
    • Exercise 5.03: Creating a fizzBuzz Function with Return Values
    • Activity 5.01: Calculating the Working Hours of Employees
    • Naked Returns
    • Exercise 5.04: Mapping a CSV Index to a Column Header with Return Values
    • Exercise 5.04: Mapping a CSV Index to a Column Header with Return Values
    • Variadic Function
    • Exercise 5.05: Summing Numbers
    • Exercise 5.05: Summing Numbers
    • Anonymous Functions
    • Exercise 5.06: Creating an Anonymous Function to Calculate the Square of a Number
    • Exercise 5.06: Creating an Anonymous Function to Calculate the Square of a Number
    • Closures
    • Exercise 5.07: Creating a Closure Function to Decrement a Counter
    • Exercise 5.07: Creating a Closure Function to Decrement a Counter
    • Function Types
    • Exercise 5.08: Creating Various Functions to Calculate Salary
    • Exercise 5.08: Creating Various Functions to Calculate Salary
    • defer
    • Activity 5.02: Calculating Payable Amount for Employees Based on Working Hours
    • Summary
  • 6. Errors

    • Overview
    • Exercise 6.01: Runtime Errors While Adding Numbers
    • Exercise 6.01: Runtime Errors While Adding Numbers
    • Exercise 6.02: Logic Error with Walking Distance
    • Exercise 6.02: Logic Error with Walking Distance
    • Error Handling Using Other Programming Languages
    • Error Interface Type
    • Exercise 6.03: Creating an Application to Calculate Pay for the Week
    • Exercise 6.03: Creating an Application to Calculate Pay for the Week
    • Panic
    • Exercise 6.04: Crashing the Program on Errors Using panic
    • Exercise 6.04: Crashing the Program on Errors Using panic
    • Recover
    • Exercise 6.05: Recovering from a Panic
    • Exercise 6.05: Recovering from a Panic
    • Guidelines when working with Errors and Panic
    • Activity 6.01: Creating a Custom Error Message for a Banking Application
    • Activity 6.02: Validating a Bank Customer's Direct Deposit Submission
    • Activity 6.03: Panic on Invalid Data Submission
    • Activity 6.04: Preventing a Panic from Crashing the App
    • Summary
  • 7. Interfaces

    • Overview
    • Interface
    • Exercise 7.01: Implementing an Interface
    • Exercise 7.01: Implementing an Interface
    • Duck Typing
    • Polymorphism
    • Exercise 7.02: Calculating the Area of Different Shapes Using Polymorphism
    • Exercise 7.02: Calculating the Area of Different Shapes Using Polymorphism
    • Accepting Interfaces and Returning Structs
    • Exercise 7.03: Analyzing Empty interface{} Data
    • Exercise 7.03: Analyzing Empty interface{} Data
    • Activity 7.01: Calculating Pay and Performance Review
    • Summary
  • 8. Packages

    • Overview
    • What Is a Package?
    • Exercise 8.01: Creating a Package to Calculate Areas of Various Shapes
    • Exercise 8.01: Creating a Package to Calculate Areas of Various Shapes
    • The init() Function
    • Exercise 8.02: Loading Budget Categories
    • Exercise 8.02: Loading Budget Categories
    • Exercise 8.03: Assigning Payees to Budget Categories
    • Exercise 8.03: Assigning Payees to Budget Categories
    • Activity 8.01: Creating a Function to Calculate Payroll and Performance Review
    • Summary
  • 9. Basic Debugging

    • Overview
    • Methods for Bug-Free Code
    • Exercise 9.01: Working with fmt.Println
    • Exercise 9.01: Working with fmt.Println
    • Formatting Using fmt.Printf()
    • Exercise 9.02: Printing Decimal, Binary, and Hex Values
    • Exercise 9.02: Printing Decimal, Binary, and Hex Values
    • Basic Debugging
    • Exercise 9.03: Printing the Go Representation of a Variable
    • Exercise 9.03: Printing the Go Representation of a Variable
    • Logging
    • Activity 9.01: Building a Program to Validate Social Security Numbers
    • Summary
  • 10. About Time

    • Overview
    • Making Time
    • Exercise 10.1: Creating a Function to Return a timestamp
    • Exercise 10.1: Creating a Function to Return a timestamp
    • Comparing Time
    • Exercise 10.2: Duration of Execution
    • Exercise 10.2: Duration of Execution
    • Duration Calculation
    • Formatting Time
    • Exercise 10.03: What Is the Time in Your Zone?
    • Exercise 10.03: What Is the Time in Your Zone?
    • Activity 10.01: Formatting a Date According to User Requirements
    • Activity 10.02: Enforcing a Specific Format of Date and Time
    • Activity 10.03: Measuring Elapsed Time
    • Activity 10.04: Calculating the Future Date and Time
    • Activity 10.05: Printing the Local Time in Different Time Zones
    • Summary
  • 11. Encoding and Decoding (JSON)

    • Overview
    • JSON
    • Decoding JSON
    • Exercise 11.01: Unmarshaling Student Courses
    • Exercise 11.01: Unmarshaling Student Courses
    • Encoding JSON
    • Exercise 11.02: Marshaling Student Courses
    • Exercise 11.02: Marshaling Student Courses
    • Exercise 11.03: Analyzing College Class JSON
    • Exercise 11.03: Analyzing College Class JSON
    • Exercise 11.04: Using gob to Encode Data
    • Exercise 11.04: Using gob to Encode Data
    • Activity 11.01: Mimicking a Customer Order Using JSON
    • Summary
  • 12. Files and Systems

    • Overview
    • Filesystem
    • Exercise 12.01: Simulating Cleanup
    • Exercise 12.01: Simulating Cleanup
    • Exercise 12.02: Backing Up Files
    • Exercise 12.02: Backing Up Files
    • Creating and Writing to Files
    • CSV
    • Activity 12.01: Parsing Bank Transaction Files
    • Summary
  • 13. SQL and Databases

    • Overview
    • The Database
    • Exercise 13.01: Creating a Table with Numbers
    • Exercise 13.01: Creating a Table with Numbers
    • Exercise 13.02: Holding Prime Numbers in a Database
    • Exercise 13.02: Holding Prime Numbers in a Database
    • Retrieving Data
    • Truncating and Deleting Table
    • Activity 13.1: Holding User Data in a Table
    • Activity 13.2: Finding Messages of Specific Users
    • Summary
  • 14. Using the Go HTTP Client

    • Overview
    • Exercise 14.01: Sending a Get Request to a Web Server Using the Go HTTP Client
    • Exercise 14.01: Sending a Get Request to a Web Server Using the Go HTTP Client
    • Exercise 14.02: Using the HTTP Client with Structured Data
    • Exercise 14.02: Using the HTTP Client with Structured Data
    • Activity 14.01: Requesting Data from a Web Server and Processing the Response
    • Exercise 14.03: Sending a Post Request to a Web Server Using the Go HTTP Client
    • Exercise 14.03: Sending a Post Request to a Web Server Using the Go HTTP Client
    • Exercise 14.04: Uploading a File to a Web Server via a Post Request
    • Exercise 14.04: Uploading a File to a Web Server via a Post Request
    • Exercise 14.05: Using Custom Headers and Options with the Go HTTP Client
    • Exercise 14.05: Using Custom Headers and Options with the Go HTTP Client
    • Activity 14.02: Sending Data to a Web Server and Checking Whether the Data Was Received Using POST and GET
    • Summary
  • 15. HTTP Servers

    • Overview
    • Exercise 15.01: Creating a Hello World Server
    • Exercise 15.01: Creating a Hello World Server
    • Exercise 15.02: Routing Our Server
    • Exercise 15.02: Routing Our Server
    • Handler versus Handler Function
    • Activity 15.01: Adding a Page Counter to an HTML Page
    • Activity 15.02: Serving a Request with a JSON Payload
    • Exercise 15.03: Personalized Welcome
    • Exercise 15.03: Personalized Welcome
    • Exercise 15.04: Templating Our Pages
    • Exercise 15.04: Templating Our Pages
    • Exercise 15.05: Creating a Hello World Server Using a Static File
    • Exercise 15.05: Creating a Hello World Server Using a Static File
    • Exercise 15.06: A Stylish Welcome
    • Exercise 15.06: A Stylish Welcome
    • Getting Dynamic
    • Activity 15.03: External Template
    • Exercise 15.07: Completing a Questionnaire
    • Exercise 15.07: Completing a Questionnaire
    • Exercise 15.08: Building a Server That Accepts JSON Requests
    • Exercise 15.08: Building a Server That Accepts JSON Requests
    • Summary
  • 16. Concurrent Work

    • Overview
    • Exercise 16.01: Using Concurrent Routines
    • Exercise 16.01: Using Concurrent Routines
    • Exercise 16.02: Experimenting with WaitGroup
    • Exercise 16.02: Experimenting with WaitGroup
    • Race Conditions
    • Exercise 16.03: An Atomic Change
    • Exercise 16.03: An Atomic Change
    • Invisible Concurrency
    • Activity 16.01: Listing Numbers
    • Exercise 16.04: Exchange Greeting Messages via Channels
    • Exercise 16.04: Exchange Greeting Messages via Channels
    • Exercise 16.05: Two-Way Message Exchange with Channels
    • Exercise 16.05: Two-Way Message Exchange with Channels
    • Exercise 16.06 Sum Numbers from Everywhere
    • Exercise 16.06 Sum Numbers from Everywhere
    • Exercise 16.07: Request to Goroutines
    • Exercise 16.07: Request to Goroutines
    • Exercise 16.08: Equally Split the Work between Routines
    • Exercise 16.08: Equally Split the Work between Routines
    • Activity 16.02: Source Files
    • Buffers
    • Exercise 16.09: Notifying When Computation Has Finished
    • Exercise 16.09: Notifying When Computation Has Finished
    • Some More Common Practices
    • Exercise 16.10: A Structured Work
    • Exercise 16.10: A structured work
    • Exercise 16.11: Managing Routines with Context
    • Exercise 16.11: Manage Routines with Context
    • Summary
  • 17. Using Go Tools

    • Overview
    • Exercise 17.01: Using the go build Tool
    • Exercise 17.01: Using the go build Tool
    • Exercise 17.02: Using the go run Tool
    • Exercise 17.02: Using the go run Tool
    • Exercise 17.03: Using the gofmt Tool
    • Exercise 17.03: Using the gofmt Tool
    • Exercise 17.04: Using the goimports Tool
    • Exercise 17.04: Using the goimports Tool
    • Exercise 17.05: Using the go vet Tool
    • Exercise 17.05: Using the go vet Tool
    • Exercise 17.06: Using the Go Race Detector
    • Exercise 17.06: Using the Go Race Detector
    • Exercise 17.07: Implementing the go doc Tool
    • Exercise 17.07: Implementing the go doc Tool
    • Exercise 17.08: Implementing the go get Tool
    • Exercise 17.08: Implementing the go get Tool
    • Activity 17.01: Using gofmt, goimport, go vet, and go get to Correct a File
    • Summary
    • Survey 2
  • 18. Security

    • Overview
    • Application Security
    • Exercise 18.01: Handling SQL Injection
    • Exercise 18.01: Handling SQL Injection
    • Exercise 18.02: Handling XSS Attacks
    • Exercise 18.02: Handling XSS Attacks
    • Exercise 18.03: Using Different Hashing Libraries
    • Exercise 18.03: Using Different Hashing Libraries
    • Exercise 18.04: Symmetric Encryption and Decryption
    • Exercise 18.04: Symmetric Encryption and Decryption
    • Exercise 18.05: Asymmetric Encryption and Decryption
    • Exercise 18.05: Asymmetric Encryption and Decryption
    • Exercise 18.06: Random Generators
    • Exercise 18.06: Random Generators
    • Exercise 18.07: Generating a Certificate and Private Key
    • Exercise 18.07: Generating a Certificate and Private Key
    • Exercise 18.08: Running an HTTPS Server
    • Exercise 18.08: Running an HTTPS Server
    • Password Management
    • Activity 18.01: Authenticating Users on the Application Using Hashed Passwords
    • Activity 18.02: Creating CA Signed Certificates Using Crypto Libraries
    • Summary
  • 19. Special Features

    • Overview
    • Reflection
    • Exercise 19.01: Using Reflection
    • Exercises 19.01: Using Reflection
    • Build Constraints
    • Activity 19.01: Defining Build Constraints Using Filenames
    • DeepEqual
    • Exercise 19.02: Using cgo with unsafe
    • Exercise 19.02: Using cgo with unsafe
    • Activity 19.02: Using Wildcard with Go Test
    • Summary
  • Activity Solutions

    • Activity 1.01 Defining and Printing
    • Activity 1.01 Defining and Printing
    • Activity 1.02: Pointer Value Swap
    • Activity 1.02: Pointer Value Swap
    • Activity 1.03: Message Bug
    • Activity 1.03: Message Bug
    • Activity 1.04: Bad Count Bug
    • Activity 1.04: Bad Count Bug
    • Activity 2.01: Implementing FizzBuzz
    • Activity 2.01: Implementing FizzBuzz
    • Activity 2.02: Looping Over Map Data Using range
    • Activity 2.02: Looping Over Map Data Using range
    • Activity 2.03: Bubble Sort
    • Activity 2.03: Bubble Sort
    • Activity 3.01: Sales Tax Calculator
    • Activity 3.01: Sales Tax Calculator
    • Activity 3.02: Loan Calculator
    • Activity 3.02: Loan Calculator
    • Activity 4.01: Filling an Array
    • Activity 4.01: Filling an Array
    • Activity 4.02: Printing a User's Name Based on User Input
    • Activity 4.02: Printing a User's Name Based on User Input
    • Activity 4.03: Creating a Locale Checker
    • Activity 4.03: Creating a Locale Checker
    • Activity 4.04: Slicing the Week
    • Activity 4.04: Slicing the Week
    • Activity 4.05: Removing an Element from a Slice
    • Activity 4.05: Removing an Element from a Slice
    • Activity 4.06: Type Checker
    • Activity 4.06: Type Checker
    • Activity 5.01: Calculating the Working Hours of Employees
    • Activity 5.01: Calculating the Working Hours of Employees
    • Activity 5.02: Calculating Payable Amount for Employees Based on Working Hours
    • Activity 5.02: Calculating Payable Amount for Employees Based on Working Hours
    • Activity 6.01: Creating a Custom Error Message for a Banking Application
    • Activity 6.01: Creating a Custom Error Message for a Banking Application
    • Activity 6.02: Validating a Bank Customer's Direct Deposit Submission
    • Activity 6.02: Validating a Bank Customer's Direct Deposit Submission
    • Activity 6.03: Panic on Invalid Data Submission
    • Activity 6.03: Panic on Invalid Data Submission
    • Activity 6.04: Preventing a Panic from Crashing the App
    • Activity 6.04: Preventing a Panic from Crashing the App
    • Activity 7.01: Calculating Pay and Performance Review
    • Activity 7.01: Calculating Pay and Performance Review
    • Activity 8.01: Creating a Function to Calculate Payroll and Performance Review
    • Activity 8.01: Creating a Function to Calculate Payroll and Performance Review
    • Activity 9.01: Building a Program to Validate Social Security Numbers
    • Activity 9.01: Building a Program to Validate Social Security Numbers
    • Activity 10.01: Formatting a Date According to User Requirements
    • Activity 10.01: Formatting a Date According to User Requirements
    • Activity 10.02: Enforcing a Specific Format of Date and Time
    • Activity 10.02: Enforcing a Specific Format of Date and Time
    • Activity 10.03: Measuring Elapsed Time
    • Activity 10.03: Measuring Elapsed Time
    • Activity 10.04: Calculating the Future Date and Time
    • Activity 10.04: Calculating the Future Date and Time
    • Activity 10.05: Printing the Local Time in Different Time Zones
    • Activity 10.05: Printing the Local Time in Different Time Zones
    • Activity 11.01: Mimicking a Customer Order Using JSON
    • Activity 11.01: Mimicking a Customer Order Using JSON
    • Activity 12.01: Parsing Bank Transaction Files
    • Activity 12.01: Parsing Bank Transaction Files
    • Activity 13.01: Holding User Data in a Table
    • Activity 13.01: Holding User Data in a Table
    • Activity 13.02: Finding Messages of Specific Users
    • Activity 13.02: Finding Messages of Specific Users
    • Activity 14.01: Requesting Data from a Web Server and Processing the Response
    • Activity 14.01: Requesting Data from a Web Server and Processing the Response
    • Activity 14.02: Sending Data to a Web Server and Checking Whether the Data Was Received Using POST and GET
    • Activity 14.02: Sending Data to a Web Server and Checking Whether the Data Was Received Using POST and GET
    • Activity 15.01: Adding a Page Counter to an HTML Page
    • Activity 15.01: Adding a Page Counter to an HTML Page
    • Activity 15.02: Serving a Request with a JSON Payload
    • Activity 15.02: Serving a Request with a JSON Payload
    • Activity 15.03: External Template
    • Activity 15.03: External Template
    • Activity 16.01: Listing Numbers
    • Activity 16.01: Listing Numbers
    • Activity 16.02: Source Files
    • Activity 16.02: Source Files
    • Activity 17.01: Using gofmt, goimport, go vet, and go get to Correct a File
    • Activity 17.01: Using gofmt, goimport, go vet, and go get to Correct a File
    • Activity 18.01: Authenticating Users on the Application Using Hashed Passwords
    • Activity 18.01: Authenticating Users on the Application Using Hashed Passwords
    • Activity 18.02: Creating CA Signed Certificates Using Crypto Libraries
    • Activity 18.02: Creating CA Signed Certificates Using Crypto Libraries
    • Activity 19.01: Defining Build Constraints Using Filenames
    • Activity 19.01: Defining Build Constraints Using Filenames
    • Activity 19.02: Using Wildcard with Go Test
    • Activity 19.02: Using Wildcard with Go Test

Get Verified

Complete The Go Workshop to unlock your certificate.

You can unlock the certificate by completing the course. The credentials are easy to share, and are ideal for displaying on your LinkedIn profile.
A copy of a certificate for The Go Workshop

Take A Step Forward

There has never been a better time to start learning Go.

  • Free

    FreeThe Go Workshop

    Unlock one year of full, unlimited access and get started right away!
    Learn for Free

Already Know Go?

Don't worry, we've got your back with other languages and frameworks too!

Show me my options!