diff --git a/go.html.markdown b/go.html.markdown
index 59ba2e4f..b93cbc61 100644
--- a/go.html.markdown
+++ b/go.html.markdown
@@ -32,11 +32,11 @@ Go comes with a good standard library and a sizeable community.
/* Multi-
line comment */
- /* A build tag is a line comment starting with // +build
+ /* A build tag is a line comment starting with //go:build
and can be executed by go build -tags="foo bar" command.
Build tags are placed before the package clause near or at the top of the file
followed by a blank line or other line comments. */
-// +build prod, dev, test
+//go:build prod || dev || test
// A package clause starts every source file.
// main is a special name declaring an executable rather than a library.
@@ -44,12 +44,13 @@ package main
// Import declaration declares library packages referenced in this file.
import (
- "fmt" // A package in the Go standard library.
- "io/ioutil" // Implements some I/O utility functions.
- m "math" // Math library with local alias m.
- "net/http" // Yes, a web server!
- "os" // OS functions like working with the file system
- "strconv" // String conversions.
+ "fmt" // A package in the Go standard library.
+ "io" // Implements some I/O utility functions.
+ m "math" // Math library with local alias m.
+ "net/http" // Yes, a web server!
+ _ "net/http/pprof" // Profiling library imported only for side effects
+ "os" // OS functions like working with the file system
+ "strconv" // String conversions.
)
// A function definition. Main is special. It is the entry point for the
@@ -106,13 +107,13 @@ can include line breaks.` // Same string type.
n := byte('\n') // byte is an alias for uint8.
// Arrays have size fixed at compile time.
- var a4 [4]int // An array of 4 ints, initialized to all 0.
+ var a4 [4]int // An array of 4 ints, initialized to all 0.
a5 := [...]int{3, 1, 5, 10, 100} // An array initialized with a fixed size of five
// elements, with values 3, 1, 5, 10, and 100.
// Arrays have value semantics.
- a4_cpy := a4 // a4_cpy is a copy of a4, two separate instances.
- a4_cpy[0] = 25 // Only a4_cpy is changed, a4 stays the same.
+ a4_cpy := a4 // a4_cpy is a copy of a4, two separate instances.
+ a4_cpy[0] = 25 // Only a4_cpy is changed, a4 stays the same.
fmt.Println(a4_cpy[0] == a4[0]) // false
// Slices have dynamic size. Arrays and slices each have advantages
@@ -123,24 +124,24 @@ can include line breaks.` // Same string type.
bs := []byte("a slice") // Type conversion syntax.
// Slices (as well as maps and channels) have reference semantics.
- s3_cpy := s3 // Both variables point to the same instance.
- s3_cpy[0] = 0 // Which means both are updated.
- fmt.Println(s3_cpy[0] == s3[0]) // true
+ s3_cpy := s3 // Both variables point to the same instance.
+ s3_cpy[0] = 0 // Which means both are updated.
+ fmt.Println(s3_cpy[0] == s3[0]) // true
// Because they are dynamic, slices can be appended to on-demand.
// To append elements to a slice, the built-in append() function is used.
// First argument is a slice to which we are appending. Commonly,
// the slice variable is updated in place, as in example below.
- s := []int{1, 2, 3} // Result is a slice of length 3.
- s = append(s, 4, 5, 6) // Added 3 elements. Slice now has length of 6.
- fmt.Println(s) // Updated slice is now [1 2 3 4 5 6]
+ s := []int{1, 2, 3} // Result is a slice of length 3.
+ s = append(s, 4, 5, 6) // Added 3 elements. Slice now has length of 6.
+ fmt.Println(s) // Updated slice is now [1 2 3 4 5 6]
// To append another slice, instead of list of atomic elements we can
// pass a reference to a slice or a slice literal like this, with a
// trailing ellipsis, meaning take a slice and unpack its elements,
// appending them to slice s.
s = append(s, []int{7, 8, 9}...) // Second argument is a slice literal.
- fmt.Println(s) // Updated slice is now [1 2 3 4 5 6 7 8 9]
+ fmt.Println(s) // Updated slice is now [1 2 3 4 5 6 7 8 9]
p, q := learnMemory() // Declares p, q to be type pointer to int.
fmt.Println(*p, *q) // * follows a pointer. This prints two ints.
@@ -160,7 +161,7 @@ can include line breaks.` // Same string type.
file, _ := os.Create("output.txt")
fmt.Fprint(file, "This is how you write to a file, by the way")
file.Close()
-
+
// Output of course counts as using a variable.
fmt.Println(s, c, a4, s3, d2, m)
@@ -179,7 +180,7 @@ func learnNamedReturns(x, y int) (z int) {
// Go is fully garbage collected. It has pointers but no pointer arithmetic.
// You can make a mistake with a nil pointer, but not by incrementing a pointer.
-// Unlike in C/Cpp taking and returning an address of a local variable is also safe.
+// Unlike in C/Cpp taking and returning an address of a local variable is also safe.
func learnMemory() (p, q *int) {
// Named return values p and q have type pointer to int.
p = new(int) // Built-in function new allocates memory.
@@ -190,7 +191,7 @@ func learnMemory() (p, q *int) {
return &s[3], &r // & takes the address of an object.
}
-// Use the aliased math library (see imports, above)
+// Use the aliased math library (see imports, above)
func expensiveComputation() float64 {
return m.Exp(10)
}
@@ -214,8 +215,8 @@ func learnFlowControl() {
case 42:
// Cases don't "fall through".
/*
- There is a `fallthrough` keyword however, see:
- https://github.com/golang/go/wiki/Switch#fall-through
+ There is a `fallthrough` keyword however, see:
+ https://github.com/golang/go/wiki/Switch#fall-through
*/
case 43:
// Unreached.
@@ -355,7 +356,7 @@ func learnInterfaces() {
}
// Functions can have variadic parameters.
-func learnVariadicParams(myStrings ...interface{}) {
+func learnVariadicParams(myStrings ...any) { // any is an alias for interface{}
// Iterate each value of the variadic.
// The underscore here is ignoring the index argument of the array.
for _, param := range myStrings {
@@ -428,7 +429,6 @@ func learnConcurrency() {
// A single function from package http starts a web server.
func learnWebProgramming() {
-
// First parameter of ListenAndServe is TCP address to listen to.
// Second parameter is an interface, specifically http.Handler.
go func() {
@@ -449,7 +449,7 @@ func requestServer() {
resp, err := http.Get("http://localhost:8080")
fmt.Println(err)
defer resp.Body.Close()
- body, err := ioutil.ReadAll(resp.Body)
+ body, err := io.ReadAll(resp.Body)
fmt.Printf("\nWebserver said: `%s`", string(body))
}
```
@@ -457,20 +457,23 @@ func requestServer() {
## Further Reading
The root of all things Go is the [official Go web site](https://go.dev/).
-There you can follow the tutorial, play interactively, and read lots.
+There you can follow the [tutorial](https://go.dev/tour/), play interactively, and read lots.
Aside from a tour, [the docs](https://go.dev/doc/) contain information on
how to write clean and effective Go code, package and command docs, and release history.
The [Go language specification](https://go.dev/ref/spec) itself is highly recommended. It's easy to read
and amazingly short (as language definitions go these days.)
-You can play around with the code on [Go playground](https://go.dev/play/p/tnWMjr16Mm). Try to change it and run it from your browser! Note that you can use [https://go.dev/play/](https://go.dev/play/) as a [REPL](https://en.wikipedia.org/wiki/Read-eval-print_loop) to test things and code in your browser, without even installing Go.
+You can play around with the code on [Go playground](https://go.dev/play/p/Y96bRpJWzjr).
+Try to change it and run it from your browser!
+Note that you can use [https://go.dev/play/](https://go.dev/play/)
+as a [REPL](https://en.wikipedia.org/wiki/Read-eval-print_loop) to test things and code in your browser, without even installing Go.
On the reading list for students of Go is the [source code to the standard
library](https://go.dev/src/). Comprehensively documented, it
demonstrates the best of readable and understandable Go, Go style, and Go
idioms. Or you can click on a function name in [the
-documentation](https://go.dev/pkg/) and the source code comes up!
+documentation](https://pkg.go.dev/std) and the source code comes up!
Another great resource to learn Go is [Go by example](https://gobyexample.com/).
@@ -480,4 +483,6 @@ There are many excellent conference talks and video tutorials on Go available on
- [Golang University 201](https://www.youtube.com/playlist?list=PLEcwzBXTPUE_5m_JaMXmGEFgduH8EsuTs) steps it up a notch, explaining important techniques like testing, web services, and APIs
- [Golang University 301](https://www.youtube.com/playlist?list=PLEcwzBXTPUE8KvXRFmmfPEUmKoy9LfmAf) dives into more advanced topics like the Go scheduler, implementation of maps and channels, and optimisation techniques
-Go Mobile adds support for mobile platforms (Android and iOS). You can write all-Go native mobile apps or write a library that contains bindings from a Go package, which can be invoked via Java (Android) and Objective-C (iOS). Check out the [Go Mobile page](https://github.com/golang/go/wiki/Mobile) for more information.
+Go Mobile adds support for mobile platforms (Android and iOS).
+You can write all-Go native mobile apps or write a library that contains bindings from a Go package,
+which can be invoked via Java (Android) and Objective-C (iOS). Check out the [Go Mobile page](https://github.com/golang/go/wiki/Mobile) for more information.