Go 1.16 Release: What Developers Need to Know
Written on
Chapter 1: Overview of Go 1.16
Recently, the Go programming language released version 1.16, which offers more substantial updates compared to the previous 1.15, which was largely shaped by the pandemic's impact.
The update touches various areas such as compilation, deployment, and the standard library. The official Go documentation categorizes the changes into Tools, Runtime, Compiler, and more. While it's beneficial to explore all these changes, it's easy to forget them quickly. To aid retention, I've grouped the significant updates into two main categories:
- Non-code-related changes (Underlining Changes)
- Standard library updates (Coding-related Changes)
Now, let's delve into some of these updates and explore their implications through specific examples.
Section 1.1: Key Underlining Changes
Enhanced macOS arm64 Support
This version improves support for macOS development on Apple's M1 chip's arm64 architecture. Both cgo and the functionality for compiling dynamic/static link libraries are now supported.
Default Go Module Activation
The need to declare the GO111MODULE environment variable has been eliminated, as Go Modules are now enabled by default, acknowledging that most developers are already using them.
Updated `go install` Command
The go install command can now install Go programs without affecting module file dependencies. For instance, you can execute go install module1/[email protected] with just the version number. Furthermore, the go get command will no longer be accepted for compiling and installing in the future.
Disallow Relative Path Imports
Imports cannot begin with a period, and non-ASCII characters are now prohibited.
Improved Race Detector Accuracy
Enabling race detection now yields more accurate race reports.
Memory Management Policy Reversion
The default memory management policy has been reverted from MADV_FREE back to MADV_MONTNEED to better align with community needs.
Section 1.2: Standard Library Enhancements
Version 1.16 includes numerous modifications to the standard library:
- The io/ioutil package has been deprecated, with its APIs transitioned to the io and os packages.
- A new read-only file interface, io/fs, has been introduced, along with the testing/fstest package.
- The embed package now allows for embedding files directly into binaries using the //go:embed command, simplifying deployment.
- The Error method must now be used to throw errors in test method goroutines, excluding the previous Fatal method.
- Minor alterations have been made in the crypto package, and the encoding package now includes changes for JSON, XML, and ASN.1.
Chapter 2: Practical Use Cases
To make the most of the new features, the first step is to install Go 1.16:
$ go get golang.org/dl/go1.16
$ go1.16 download
This will unpack the SDK, allowing you to run go1.16. The SDK will be located in the directory /Users/xxx/sdk/go1.16.
Section 2.1: Using the Embed Feature
Go previously faced issues where binary executables would fail to function when moved to different directories due to their inability to locate the necessary configuration files. While Docker images often masked this issue, the new embed package resolves it by packaging files directly within the binary.
Use the //go:embed directive in your code to include static files. Here’s a simple example demonstrating this functionality.
The embed package supports various types, including string, byte, slice, and fs, allowing for straightforward embedding of entire directories.
In my view, the embed feature offers three main advantages:
- It supports multiple embedding formats, making it user-friendly.
- It enhances security as all embedding occurs during compile time.
- It boosts the portability of Go binaries, enabling them to run anywhere, akin to Java JAR files.
Section 2.2: Introduction to the New io/fs Package
The io/fs package introduces an interface for read-only file trees, providing a more generalized interface for different file system types.
The FS interface is straightforward, and in addition to Open, it offers FindFile and ReadDir interfaces for reading files and directories, respectively.
By examining the embed.FS code, one can gain a better understanding of the io/fs logic. To access file content, the embed package implements the fs.FS, fs.File, and fs.ReadDirFile interfaces.
Chapter 3: Conclusion and Future Outlook
With the release of Go 1.16, developers will need time to adapt and evaluate the changes. Whether they embrace or resist these updates remains to be seen. Personally, the embed feature alone makes the upgrade worthwhile. Let’s stay tuned for community updates, as generics are on the horizon.
Thanks for reading!
References
In this video, "Minecraft 1.16 Celebrating The Release Date In The Nether!", viewers can explore the new features of the game that aligns with the Go 1.16 update.
The second video, "UPDATE 1.16 IS READY TO LAUNCH! (GTA 5 Online DLC)", showcases the latest updates in the realm of gaming, reflecting similar excitement as seen in the Go 1.16 launch.