Handling errors in GoCreating an errorUsing an errorCreating named errorsCustom errorsWrapping errorsUtilizing Go constants Declaring a constantEnumeration via constantsPrinting enumeratorsUsing defer, panic, and recoverdeferpanicrecoverUtilizing goroutines for concurrencyStarting a goroutineSynchronizationWaitGroupsChannelsSending/receivingselect statementsChannels as an event signalMutexesRWMutexUnderstanding Go's Context typeUsing a Context to signal a timeoutHonoring a context when receivingContext in the standard libraryContext to pass valuesBest practicesUtilizing Go's testing frameworkCreating a basic test fileCreating a simple testTable Driven Tests (TDT)Creating fakes with interfacesThird-party testing packagesGenerics – the new kid on the blockType parametersUsing type constraintsWe could do better with constraintsCurrent built-in constraintsType constraints with methodsAdding type parameters to struct typesSpecifying the type when calling a generic functionGotchas to watch forWhen to use genericsSummary