From 42371916d83af7fc2e4ca053d963e6cfab15a8f1 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Mon, 28 Oct 2019 19:53:52 -0400 Subject: [PATCH] blog/get-going-hello-world: second draft (#90) * blog/get-going-hello-world: second draft Thanks @faithanalog for feedback * Update get-going-hello-world-2019-10-28.markdown * Update get-going-hello-world-2019-10-28.markdown --- .../get-going-hello-world-2019-10-28.markdown | 228 ++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 blog/get-going-hello-world-2019-10-28.markdown diff --git a/blog/get-going-hello-world-2019-10-28.markdown b/blog/get-going-hello-world-2019-10-28.markdown new file mode 100644 index 0000000..a969946 --- /dev/null +++ b/blog/get-going-hello-world-2019-10-28.markdown @@ -0,0 +1,228 @@ +--- +title: "Get Going: Hello, World!" +date: 2019-10-28 +series: get-going +tags: + - golang + - book + - draft +--- + +# Get Going: Hello, World! + +This post is a draft of the first chapter in a book I'm writing to help people learn the +[Go][go] programming language. It's aimed at people who understand the high +level concepts of programming, but haven't had much practical experience with +it. This is a sort of spiritual successor to my old +[Getting Started with Go][gswg] post from 2015. A lot has changed in the +ecosystem since then, as well as my understanding of the language. + +[go]: https://golang.org +[gswg]: https://christine.website/blog/getting-started-with-go-2015-01-28 + +Like always, feedback is very welcome. Any feedback I get will be used to help +make this book even better. + +This article is a bit of an expanded version of what the first chapter will +eventually be. I also plan to turn a version of this article into a workshop for +my dayjob. + +## What is Go? + +Go is a compiled programming language made by Google. It has a lot of features +out of the box, including: + +* A static type system +* Fast compile times +* Efficient code generation +* Parallel programming for free* +* A strong standard library +* Cross-compilation with ease (including webassembly) +* and more! + +\* You still have to write code that can avoid race conditions, more on those +later. + +### Why Use Go? + +Go is a very easy to read and write programming language. Consider this snippet: + +```go +func Add(x int, y int) int { + return x + y +} +``` + +This function wraps [integer +addition](https://golang.org/ref/spec#Arithmetic_operators). When you call it it +returns the sum of x and y. + +## Installing Go + +### Linux + +Installing Go on Linux systems is a very distribution-specific thing. Please see +[this tutorial on +DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-install-go-on-ubuntu-18-04) +for more information. + +### macOS + +* Go to https://golang.org/dl +* Download the .pkg file +* Double-click on it and go through the installer process + +### Windows + +* Go to https://golang.org/dl +* Download the .msi file +* Double-click on it and go through the installer process + +### Next Steps + +These next steps are needed to set up your shell for Go programs. + +Pick a directory you want to store Go programs and downloaded source code in. +This is called your GOPATH. This is usually the `go` folder in +your home directory. If for some reason you want another folder for this, use +that folder instead of `$HOME/go` below. + +#### Linux/macOS + +This next step is unfortunately shell-specific. To find out what shell you are +using, run the following command in your terminal: + +```console +$ env | grep SHELL +``` + +The name at the path will be the shell you are using. + +##### bash + +If you are using bash, add the following lines to your .bashrc (Linux) or +.bash_profile (macOS): + +``` +export GOPATH=$HOME/go +export PATH="$PATH:$GOPATH/bin" +``` + +Then reload the configuration by closing and re-opening your terminal. + +##### fish + +If you are using fish, create a file in ~/.config/fish/conf.d/go.fish with the +following lines: + +``` +set -gx GOPATH $HOME/go +set -gx PATH $PATH "$GOPATH/bin" +``` + +##### zsh + +If you are using zsh, add the following lines to your .zshrc: + +``` +export GOPATH=$HOME/go +export PATH="$PATH:$GOPATH/bin" +``` + +#### Windows + +Follow the instructions +[here](https://github.com/golang/go/wiki/SettingGOPATH#windows). + +## Installing a Text Editor + +For this book, we will be using VS Code. Download and install it +from https://code.visualstudio.com. The default settings will let you work with +Go code. + +## Hello, world! + +Now that everything is installed, let's test it with the classic "Hello, world!" +program. Create a folder in your home folder `Code`. Create another folder +inside that Code folder called `get_going` and create yet another subfolder +called `hello`. Open a file in there with VS Code (Open Folder -> Code -> +get_going -> hello) called `hello.go` and type in the following: + +```go +// Command hello is your first Go program. +package main + +import "fmt" + +func main() { + fmt.Println("Hello, world!") +} +``` + +This program prints "Hello, world!" and then immediately exits. Here's each of +the parts in detail: + +```go +// Command hello is your first go program. +package main // Every go file must be in a package. + // Package main is used for creating executable files. + +import "fmt" // Go doesn't implicitly import anything. You need to + // explicitly import "fmt" for printing text to + // standard output. + +func main() { // func main is the entrypoint of the program, or + // where the computer starts executing your code + fmt.Println("Hello, world!") // This prints "Hello, world!" followed by a newline + // to standard output. +} // This ends the main function +``` + +Now click over to the terminal at the bottom of the VS Code window and run this +program with the following command: + +```console +$ go run hello.go +Hello, world! +``` + +`go run` compiles and runs the code for you, without creating a persistent binary +file. This is a good way to run programs while you are writing them. + +To create a binary, use `go build`: + +```console +$ go build hello.go +$ ./hello +Hello, world! +``` + +`go build` has the compiler create a persistent binary file and puts it in the +same directory as you are running `go` from. Go will choose the filename of the +binary based on the name of the .go file passed to it. These binaries are +usually static binaries, or binaries that are safe to distribute to other +computers without having to worry about linked libraries. + +## Exercises + +The following is a list of optional exercises that may help you understand more: + +1. Replace the "world" in "Hello, world!" with your name. +2. Rename `hello.go` to `main.go`. Does everything still work? +3. Read through the documentation of the [fmt][fmt] package. + +[fmt]: https://golang.org/pkg/fmt + +--- + +And that about wraps it up for Lesson 1 in Go. Like I mentioned before, feedback +on this helps a lot. + +Up next is an overview on data types such as integers, true/false booleans, +floating-point numbers and strings. + +I plan to post the book source code on my GitHub page once I have more than one +chapter drafted. + + +Thanks and be well.