| 
									
										
										
										
											2012-01-19 11:24:54 +11:00
										 |  |  | <!--{
 | 
					
						
							|  |  |  | 	"Title": "How to Write Go Code" | 
					
						
							|  |  |  | }--> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | <h2 id="Introduction">Introduction</h2> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | This document demonstrates the development of a simple Go package and | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | introduces the <a href="/cmd/go/">go tool</a>, the standard way to fetch, | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | build, and install Go packages and commands. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-13 16:50:44 +01:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | The <code>go</code> tool requires you to organize your code in a specific | 
					
						
							|  |  |  | way. Please read this document carefully. | 
					
						
							|  |  |  | It explains the simplest way to get up and running with your Go installation. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | A similar explanation is available as a | 
					
						
							| 
									
										
										
										
											2014-07-25 10:28:39 +10:00
										 |  |  | <a href="//www.youtube.com/watch?v=XCsL89YtqCs">screencast</a>. | 
					
						
							| 
									
										
										
										
											2012-11-13 16:50:44 +01:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:56:11 +11:00
										 |  |  | <h2 id="Organization">Code organization</h2> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | <h3 id="Overview">Overview</h3> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <ul> | 
					
						
							|  |  |  | 	<li>Go programmers typically keep all their Go code in a single <i>workspace</i>.</li> | 
					
						
							|  |  |  | 	<li>A workspace contains many version control <i>repositories</i> | 
					
						
							|  |  |  | 	    (managed by Git, for example).</li> | 
					
						
							|  |  |  | 	<li>Each repository contains one or more <i>packages</i>.</li> | 
					
						
							|  |  |  | 	<li>Each package consists of one or more Go source files in a single directory.</li> | 
					
						
							|  |  |  | 	<li>The path to a package's directory determines its <i>import path</i>.</li> | 
					
						
							|  |  |  | </ul> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | Note that this differs from other programming environments in which every | 
					
						
							|  |  |  | project has a separate workspace and workspaces are closely tied to version | 
					
						
							|  |  |  | control repositories. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | <h3 id="Workspaces">Workspaces</h3> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | A workspace is a directory hierarchy with three directories at its root: | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <ul> | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | <li><code>src</code> contains Go source files, | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <li><code>pkg</code> contains package objects, and | 
					
						
							|  |  |  | <li><code>bin</code> contains executable commands. | 
					
						
							|  |  |  | </ul> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | The <code>go</code> tool builds source packages and installs the resulting | 
					
						
							|  |  |  | binaries to the <code>pkg</code> and <code>bin</code> directories. | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | The <code>src</code> subdirectory typically contains multiple version control | 
					
						
							|  |  |  | repositories (such as for Git or Mercurial) that track the development of one | 
					
						
							|  |  |  | or more source packages. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | To give you an idea of how a workspace looks in practice, here's an example: | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <pre> | 
					
						
							|  |  |  | bin/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |     hello                          # command executable | 
					
						
							|  |  |  |     outyet                         # command executable | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | pkg/ | 
					
						
							|  |  |  |     linux_amd64/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |         github.com/golang/example/ | 
					
						
							|  |  |  |             stringutil.a           # package object | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | src/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |     <a href="https://github.com/golang/example/">github.com/golang/example/</a> | 
					
						
							|  |  |  |         .git/                      # Git repository metadata | 
					
						
							|  |  |  | 	hello/ | 
					
						
							|  |  |  | 	    hello.go               # command source | 
					
						
							|  |  |  | 	outyet/ | 
					
						
							|  |  |  | 	    main.go                # command source | 
					
						
							|  |  |  | 	    main_test.go           # test source | 
					
						
							|  |  |  | 	stringutil/ | 
					
						
							|  |  |  | 	    reverse.go             # package source | 
					
						
							|  |  |  | 	    reverse_test.go        # test source | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  |     <a href="https://golang.org/x/image/">golang.org/x/image/</a> | 
					
						
							|  |  |  |         .git/                      # Git repository metadata | 
					
						
							|  |  |  | 	bmp/ | 
					
						
							|  |  |  | 	    reader.go              # package source | 
					
						
							|  |  |  | 	    writer.go              # package source | 
					
						
							|  |  |  |     ... (many more repositories and packages omitted) ... | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | The tree above shows a workspace containing two repositories | 
					
						
							|  |  |  | (<code>example</code> and <code>image</code>). | 
					
						
							|  |  |  | The <code>example</code> repository contains two commands (<code>hello</code> | 
					
						
							|  |  |  | and <code>outyet</code>) and one library (<code>stringutil</code>). | 
					
						
							|  |  |  | The <code>image</code> repository contains the <code>bmp</code> package | 
					
						
							|  |  |  | and <a href="https://godoc.org/golang.org/x/image">several others</a>. | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | A typical workspace contains many source repositories containing many | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | packages and commands. Most Go programmers keep <i>all</i> their Go source code | 
					
						
							|  |  |  | and dependencies in a single workspace. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Commands and libraries are built from different kinds of source packages. | 
					
						
							|  |  |  | We will discuss the distinction <a href="#PackageNames">later</a>. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <h3 id="GOPATH">The <code>GOPATH</code> environment variable</h3> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | The <code>GOPATH</code> environment variable specifies the location of your | 
					
						
							| 
									
										
										
										
											2016-11-30 14:56:58 -05:00
										 |  |  | workspace. It defaults to a directory named <code>go</code> inside your home directory, | 
					
						
							|  |  |  | so <code>$HOME/go</code> on Unix, | 
					
						
							|  |  |  | <code>$home/go</code> on Plan 9, | 
					
						
							|  |  |  | and <code>%USERPROFILE%\go</code> (usually <code>C:\Users\YourName\go</code>) on Windows. | 
					
						
							| 
									
										
										
										
											2017-02-02 11:48:22 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | If you would like to work in a different location, you will need to | 
					
						
							|  |  |  | <a href="https://golang.org/wiki/SettingGOPATH">set <code>GOPATH</code></a> | 
					
						
							|  |  |  | to the path to that directory. | 
					
						
							| 
									
										
										
										
											2016-11-30 14:56:58 -05:00
										 |  |  | (Another common setup is to set <code>GOPATH=$HOME</code>.) | 
					
						
							|  |  |  | Note that <code>GOPATH</code> must <b>not</b> be the | 
					
						
							|  |  |  | same path as your Go installation. | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2016-11-30 14:56:58 -05:00
										 |  |  | The command <code>go</code> <code>env</code> <code>GOPATH</code> | 
					
						
							|  |  |  | prints the effective current <code>GOPATH</code>; | 
					
						
							|  |  |  | it prints the default location if the environment variable is unset. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | For convenience, add the workspace's <code>bin</code> subdirectory | 
					
						
							|  |  |  | to your <code>PATH</code>: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2016-11-30 14:56:58 -05:00
										 |  |  | $ <b>export PATH=$PATH:$(go env GOPATH)/bin</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2016-11-30 14:56:58 -05:00
										 |  |  | The scripts in the rest of this document use <code>$GOPATH</code> | 
					
						
							|  |  |  | instead of <code>$(go env GOPATH)</code> for brevity. | 
					
						
							|  |  |  | To make the scripts run as written | 
					
						
							|  |  |  | if you have not set GOPATH, | 
					
						
							|  |  |  | you can substitute $HOME/go in those commands | 
					
						
							|  |  |  | or else run: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2016-11-30 14:56:58 -05:00
										 |  |  | $ <b>export GOPATH=$(go env GOPATH)</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-03 10:46:45 -08:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2017-01-05 12:28:06 -08:00
										 |  |  | To learn more about the <code>GOPATH</code> environment variable, see | 
					
						
							|  |  |  | <a href="/cmd/go/#hdr-GOPATH_environment_variable"><code>'go help gopath'</code></a>. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | To use a custom workspace location, | 
					
						
							| 
									
										
										
										
											2017-01-06 15:09:10 -08:00
										 |  |  | <a href="https://golang.org/wiki/SettingGOPATH">set the <code>GOPATH</code> environment variable</a>. | 
					
						
							| 
									
										
										
										
											2015-01-03 10:46:45 -08:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | <h3 id="ImportPaths">Import paths</h3> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | An <i>import path</i> is a string that uniquely identifies a package. | 
					
						
							|  |  |  | A package's import path corresponds to its location inside a workspace | 
					
						
							|  |  |  | or in a remote repository (explained below). | 
					
						
							|  |  |  | </p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2016-01-08 12:06:45 +11:00
										 |  |  | The packages from the standard library are given short import paths such as | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <code>"fmt"</code> and <code>"net/http"</code>. | 
					
						
							|  |  |  | For your own packages, you must choose a base path that is unlikely to | 
					
						
							|  |  |  | collide with future additions to the standard library or other external | 
					
						
							|  |  |  | libraries. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | If you keep your code in a source repository somewhere, then you should use the | 
					
						
							|  |  |  | root of that source repository as your base path. | 
					
						
							|  |  |  | For instance, if you have a <a href="https://github.com/">GitHub</a> account at | 
					
						
							|  |  |  | <code>github.com/user</code>, that should be your base path. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Note that you don't need to publish your code to a remote repository before you | 
					
						
							|  |  |  | can build it. It's just a good habit to organize your code as if you will | 
					
						
							|  |  |  | publish it someday. In practice you can choose any arbitrary path name, | 
					
						
							|  |  |  | as long as it is unique to the standard library and greater Go ecosystem. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | We'll use <code>github.com/user</code> as our base path. Create a directory | 
					
						
							|  |  |  | inside your workspace in which to keep source code: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>mkdir -p $GOPATH/src/github.com/user</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <h3 id="Command">Your first program</h3> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | To compile and run a simple program, first choose a package path (we'll use | 
					
						
							|  |  |  | <code>github.com/user/hello</code>) and create a corresponding package directory | 
					
						
							|  |  |  | inside your workspace: | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>mkdir $GOPATH/src/github.com/user/hello</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-18 10:08:49 -04:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Next, create a file named <code>hello.go</code> inside that directory, | 
					
						
							|  |  |  | containing the following Go code. | 
					
						
							| 
									
										
										
										
											2010-08-18 10:08:49 -04:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <pre> | 
					
						
							|  |  |  | package main | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | import "fmt" | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | func main() { | 
					
						
							|  |  |  | 	fmt.Printf("Hello, world.\n") | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Now you can build and install that program with the <code>go</code> tool: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>go install github.com/user/hello</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Note that you can run this command from anywhere on your system. The | 
					
						
							|  |  |  | <code>go</code> tool finds the source code by looking for the | 
					
						
							|  |  |  | <code>github.com/user/hello</code> package inside the workspace specified by | 
					
						
							|  |  |  | <code>GOPATH</code>. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | You can also omit the package path if you run <code>go install</code> from the | 
					
						
							|  |  |  | package directory: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>cd $GOPATH/src/github.com/user/hello</b> | 
					
						
							|  |  |  | $ <b>go install</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | This command builds the <code>hello</code> command, producing an executable | 
					
						
							|  |  |  | binary. It then installs that binary to the workspace's <code>bin</code> | 
					
						
							|  |  |  | directory as <code>hello</code> (or, under Windows, <code>hello.exe</code>). | 
					
						
							| 
									
										
										
										
											2013-04-03 16:44:03 -07:00
										 |  |  | In our example, that will be <code>$GOPATH/bin/hello</code>, which is | 
					
						
							| 
									
										
										
										
											2014-12-16 12:16:25 +11:00
										 |  |  | <code>$HOME/work/bin/hello</code>. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <p> | 
					
						
							|  |  |  | The <code>go</code> tool will only print output when an error occurs, so if | 
					
						
							|  |  |  | these commands produce no output they have executed successfully. | 
					
						
							|  |  |  | </p> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | You can now run the program by typing its full path at the command line: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <pre> | 
					
						
							|  |  |  | $ <b>$GOPATH/bin/hello</b> | 
					
						
							| 
									
										
										
										
											2013-04-04 11:11:54 -07:00
										 |  |  | Hello, world. | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Or, as you have added <code>$GOPATH/bin</code> to your <code>PATH</code>, | 
					
						
							|  |  |  | just type the binary name: | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <pre> | 
					
						
							|  |  |  | $ <b>hello</b> | 
					
						
							| 
									
										
										
										
											2013-04-04 11:11:54 -07:00
										 |  |  | Hello, world. | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | If you're using a source control system, now would be a good time to initialize | 
					
						
							|  |  |  | a repository, add the files, and commit your first change. Again, this step is | 
					
						
							|  |  |  | optional: you do not need to use source control to write Go code. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>cd $GOPATH/src/github.com/user/hello</b> | 
					
						
							|  |  |  | $ <b>git init</b> | 
					
						
							| 
									
										
										
										
											2014-12-16 12:16:25 +11:00
										 |  |  | Initialized empty Git repository in /home/user/work/src/github.com/user/hello/.git/ | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>git add hello.go</b> | 
					
						
							|  |  |  | $ <b>git commit -m "initial commit"</b> | 
					
						
							|  |  |  | [master (root-commit) 0b4507d] initial commit | 
					
						
							|  |  |  |  1 file changed, 1 insertion(+) | 
					
						
							|  |  |  |   create mode 100644 hello.go | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Pushing the code to a remote repository is left as an exercise for the reader. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <h3 id="Library">Your first library</h3> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | Let's write a library and use it from the <code>hello</code> program. | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-03 16:44:03 -07:00
										 |  |  | Again, the first step is to choose a package path (we'll use | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | <code>github.com/user/stringutil</code>) and create the package directory: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | $ <b>mkdir $GOPATH/src/github.com/user/stringutil</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | Next, create a file named <code>reverse.go</code> in that directory with the | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | following contents. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | // Package stringutil contains utility functions for working with strings. | 
					
						
							|  |  |  | package stringutil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Reverse returns its argument string reversed rune-wise left to right. | 
					
						
							|  |  |  | func Reverse(s string) string { | 
					
						
							|  |  |  | 	r := []rune(s) | 
					
						
							|  |  |  | 	for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { | 
					
						
							|  |  |  | 		r[i], r[j] = r[j], r[i] | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | 	return string(r) | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | } | 
					
						
							|  |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Now, test that the package compiles with <code>go build</code>: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | $ <b>go build github.com/user/stringutil</b> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Or, if you are working in the package's source directory, just: | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>go build</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | This won't produce an output file. To do that, you must use <code>go | 
					
						
							|  |  |  | install</code>, which places the package object inside the <code>pkg</code> | 
					
						
							|  |  |  | directory of the workspace. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | After confirming that the <code>stringutil</code> package builds, | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | modify your original <code>hello.go</code> (which is in | 
					
						
							|  |  |  | <code>$GOPATH/src/github.com/user/hello</code>) to use it: | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2010-11-23 10:42:04 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | package main | 
					
						
							| 
									
										
										
										
											2010-11-23 10:42:04 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | 	<b>"github.com/user/stringutil"</b> | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2010-11-23 10:42:04 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | 	fmt.Printf(stringutil.Reverse("!oG ,olleH")) | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-11-23 10:42:04 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Whenever the <code>go</code> tool installs a package or binary, it also | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | installs whatever dependencies it has. | 
					
						
							|  |  |  | So when you install the <code>hello</code> program | 
					
						
							| 
									
										
										
										
											2010-11-23 10:42:04 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>go install github.com/user/hello</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | the <code>stringutil</code> package will be installed as well, automatically. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | Running the new version of the program, you should see a new, reversed message: | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>hello</b> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | Hello, Go! | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | After the steps above, your workspace should look like this: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							|  |  |  | bin/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |     hello                 # command executable | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | pkg/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |     linux_amd64/          # this will reflect your OS and architecture | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  |         github.com/user/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |             stringutil.a  # package object | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | src/ | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  |     github.com/user/ | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  |         hello/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |             hello.go      # command source | 
					
						
							|  |  |  |         stringutil/ | 
					
						
							|  |  |  |             reverse.go    # package source | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | Note that <code>go install</code> placed the <code>stringutil.a</code> object | 
					
						
							|  |  |  | in a directory inside <code>pkg/linux_amd64</code> that mirrors its source | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | directory. | 
					
						
							|  |  |  | This is so that future invocations of the <code>go</code> tool can find the | 
					
						
							|  |  |  | package object and avoid recompiling the package unnecessarily. | 
					
						
							|  |  |  | The <code>linux_amd64</code> part is there to aid in cross-compilation, | 
					
						
							|  |  |  | and will reflect the operating system and architecture of your system. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-03 16:44:03 -07:00
										 |  |  | Go command executables are statically linked; the package objects need not | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | be present to run Go programs. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <h3 id="PackageNames">Package names</h3> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | The first statement in a Go source file must be | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							|  |  |  | package <i>name</i> | 
					
						
							|  |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | where <code><i>name</i></code> is the package's default name for imports. | 
					
						
							|  |  |  | (All files in a package must use the same <code><i>name</i></code>.) | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | Go's convention is that the package name is the last element of the | 
					
						
							|  |  |  | import path: the package imported as "<code>crypto/rot13</code>" | 
					
						
							|  |  |  | should be named <code>rot13</code>. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | Executable commands must always use <code>package main</code>. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | There is no requirement that package names be unique | 
					
						
							|  |  |  | across all packages linked into a single binary, | 
					
						
							|  |  |  | only that the import paths (their full file names) be unique. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | See <a href="/doc/effective_go.html#names">Effective Go</a> to learn more about | 
					
						
							|  |  |  | Go's naming conventions. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <h2 id="Testing">Testing</h2> | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | Go has a lightweight test framework composed of the <code>go test</code> | 
					
						
							|  |  |  | command and the <code>testing</code> package. | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | You write a test by creating a file with a name ending in <code>_test.go</code> | 
					
						
							|  |  |  | that contains functions named <code>TestXXX</code> with signature | 
					
						
							|  |  |  | <code>func (t *testing.T)</code>. | 
					
						
							|  |  |  | The test framework runs each such function; | 
					
						
							|  |  |  | if the function calls a failure function such as <code>t.Error</code> or | 
					
						
							|  |  |  | <code>t.Fail</code>, the test is considered to have failed. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | Add a test to the <code>stringutil</code> package by creating the file | 
					
						
							|  |  |  | <code>$GOPATH/src/github.com/user/stringutil/reverse_test.go</code> containing | 
					
						
							|  |  |  | the following Go code. | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | package stringutil | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | import "testing" | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | func TestReverse(t *testing.T) { | 
					
						
							|  |  |  | 	cases := []struct { | 
					
						
							|  |  |  | 		in, want string | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{"Hello, world", "dlrow ,olleH"}, | 
					
						
							|  |  |  | 		{"Hello, 世界", "界世 ,olleH"}, | 
					
						
							|  |  |  | 		{"", ""}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, c := range cases { | 
					
						
							|  |  |  | 		got := Reverse(c.in) | 
					
						
							|  |  |  | 		if got != c.want { | 
					
						
							|  |  |  | 			t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-04-23 13:13:51 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | } | 
					
						
							|  |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Then run the test with <code>go test</code>: | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | $ <b>go test github.com/user/stringutil</b> | 
					
						
							|  |  |  | ok  	github.com/user/stringutil 0.165s | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | As always, if you are running the <code>go</code> tool from the package | 
					
						
							|  |  |  | directory, you can omit the package path: | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>go test</b> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | ok  	github.com/user/stringutil 0.165s | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-01-15 19:25:16 +11:00
										 |  |  | Run <code><a href="/cmd/go/#hdr-Test_packages">go help test</a></code> and see the | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <a href="/pkg/testing/">testing package documentation</a> for more detail. | 
					
						
							|  |  |  | </p> | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 11:29:09 -05:00
										 |  |  | <h2 id="remote">Remote packages</h2> | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | An import path can describe how to obtain the package source code using a | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | revision control system such as Git or Mercurial. The <code>go</code> tool uses | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | this property to automatically fetch packages from remote repositories. | 
					
						
							|  |  |  | For instance, the examples described in this document are also kept in a | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | Git repository hosted at GitHub | 
					
						
							|  |  |  | <code><a href="https://github.com/golang/example">github.com/golang/example</a></code>. | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | If you include the repository URL in the package's import path, | 
					
						
							|  |  |  | <code>go get</code> will fetch, build, and install it automatically: | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | $ <b>go get github.com/golang/example/hello</b> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>$GOPATH/bin/hello</b> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | Hello, Go examples! | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | If the specified package is not present in a workspace, <code>go get</code> | 
					
						
							|  |  |  | will place it inside the first workspace specified by <code>GOPATH</code>. | 
					
						
							|  |  |  | (If the package does already exist, <code>go get</code> skips the remote | 
					
						
							|  |  |  | fetch and behaves the same as <code>go install</code>.) | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | After issuing the above <code>go get</code> command, the workspace directory | 
					
						
							| 
									
										
										
										
											2013-04-23 13:13:51 -07:00
										 |  |  | tree should now look like this: | 
					
						
							| 
									
										
										
										
											2010-05-30 19:21:49 +02:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2011-03-04 12:28:08 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <pre> | 
					
						
							|  |  |  | bin/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |     hello                           # command executable | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | pkg/ | 
					
						
							| 
									
										
										
										
											2013-04-03 16:44:03 -07:00
										 |  |  |     linux_amd64/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |         github.com/golang/example/ | 
					
						
							|  |  |  |             stringutil.a            # package object | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  |         github.com/user/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |             stringutil.a            # package object | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | src/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |     github.com/golang/example/ | 
					
						
							|  |  |  | 	.git/                       # Git repository metadata | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  |         hello/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |             hello.go                # command source | 
					
						
							|  |  |  |         stringutil/ | 
					
						
							|  |  |  |             reverse.go              # package source | 
					
						
							|  |  |  |             reverse_test.go         # test source | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  |     github.com/user/ | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  |         hello/ | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  |             hello.go                # command source | 
					
						
							|  |  |  |         stringutil/ | 
					
						
							|  |  |  |             reverse.go              # package source | 
					
						
							|  |  |  |             reverse_test.go         # test source | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							| 
									
										
										
										
											2011-03-04 12:28:08 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | The <code>hello</code> command hosted at GitHub depends on the | 
					
						
							|  |  |  | <code>stringutil</code> package within the same repository. The imports in | 
					
						
							|  |  |  | <code>hello.go</code> file use the same import path convention, so the | 
					
						
							|  |  |  | <code>go get</code> command is able to locate and install the dependent | 
					
						
							|  |  |  | package, too. | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2011-03-04 12:28:08 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | import "github.com/golang/example/stringutil" | 
					
						
							| 
									
										
										
										
											2011-03-04 12:28:08 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							|  |  |  | This convention is the easiest way to make your Go packages available for | 
					
						
							|  |  |  | others to use. | 
					
						
							| 
									
										
										
										
											2014-12-10 11:01:55 +11:00
										 |  |  | The <a href="//golang.org/wiki/Projects">Go Wiki</a> | 
					
						
							| 
									
										
										
										
											2014-07-25 10:28:39 +10:00
										 |  |  | and <a href="//godoc.org/">godoc.org</a> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:56:11 +11:00
										 |  |  | provide lists of external Go projects. | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2012-01-12 08:25:49 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | For more information on using remote repositories with the <code>go</code> tool, see | 
					
						
							| 
									
										
										
										
											2013-10-09 07:05:43 +11:00
										 |  |  | <code><a href="/cmd/go/#hdr-Remote_import_paths">go help importpath</a></code>. | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							| 
									
										
										
										
											2011-03-04 12:28:08 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-21 07:55:29 +11:00
										 |  |  | <h2 id="next">What's next</h2> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | Subscribe to the | 
					
						
							| 
									
										
										
										
											2014-07-25 10:28:39 +10:00
										 |  |  | <a href="//groups.google.com/group/golang-announce">golang-announce</a> | 
					
						
							| 
									
										
										
										
											2013-11-21 07:55:29 +11:00
										 |  |  | mailing list to be notified when a new stable version of Go is released. | 
					
						
							|  |  |  | </p> | 
					
						
							| 
									
										
										
										
											2011-03-04 12:28:08 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | <p> | 
					
						
							|  |  |  | See <a href="/doc/effective_go.html">Effective Go</a> for tips on writing | 
					
						
							|  |  |  | clear, idiomatic Go code. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2014-07-25 10:28:39 +10:00
										 |  |  | Take <a href="//tour.golang.org/">A Tour of Go</a> to learn the language | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | proper. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | Visit the <a href="/doc/#articles">documentation page</a> for a set of in-depth | 
					
						
							|  |  |  | articles about the Go language and its libraries and tools. | 
					
						
							|  |  |  | </p> | 
					
						
							| 
									
										
										
										
											2013-11-21 07:55:29 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <h2 id="help">Getting help</h2> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | For real-time help, ask the helpful gophers in <code>#go-nuts</code> on the | 
					
						
							|  |  |  | <a href="http://freenode.net/">Freenode</a> IRC server. | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | The official mailing list for discussion of the Go language is | 
					
						
							| 
									
										
										
										
											2014-07-25 10:28:39 +10:00
										 |  |  | <a href="//groups.google.com/group/golang-nuts">Go Nuts</a>. | 
					
						
							| 
									
										
										
										
											2013-11-21 07:55:29 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | Report bugs using the | 
					
						
							| 
									
										
										
										
											2014-12-10 11:01:55 +11:00
										 |  |  | <a href="//golang.org/issue">Go issue tracker</a>. | 
					
						
							| 
									
										
										
										
											2013-11-21 07:55:29 +11:00
										 |  |  | </p> |