| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <h3 id="Workspaces">Workspaces</h3> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | The <code>go</code> tool is designed to work with open source code maintained | 
					
						
							|  |  |  | in public repositories. Although you don't need to publish your code, the model | 
					
						
							|  |  |  | for how the environment is set up works the same whether you do or not. | 
					
						
							| 
									
										
										
										
											2009-12-09 14:05:12 -08:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | Go code must be kept inside a <i>workspace</i>. | 
					
						
							|  |  |  | 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> | 
					
						
							|  |  |  | <li><code>src</code> contains Go source files organized into packages (one package per directory), | 
					
						
							|  |  |  | <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 | 
					
						
							| 
									
										
										
										
											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> | 
					
						
							| 
									
										
										
										
											2014-11-10 09:15:57 +11:00
										 |  |  | This workspace contains one repository (<code>example</code>) | 
					
						
							|  |  |  | comprising two commands (<code>hello</code> and <code>outyet</code>) | 
					
						
							|  |  |  | and one library (<code>stringutil</code>). | 
					
						
							|  |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							|  |  |  | A typical workspace would contain many source repositories containing many | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  | workspace. It is likely the only environment variable you'll need to set | 
					
						
							|  |  |  | when developing Go 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
										 |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | To get started, create a workspace directory and set <code>GOPATH</code> | 
					
						
							|  |  |  | accordingly. Your workspace can be located wherever you like, but we'll use | 
					
						
							|  |  |  | <code>$HOME/go</code> in this document. Note that this 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
										 |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | $ <b>mkdir $HOME/go</b> | 
					
						
							|  |  |  | $ <b>export GOPATH=$HOME/go</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> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | For convenience, add the workspace's <code>bin</code> subdirectory | 
					
						
							|  |  |  | to your <code>PATH</code>: | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </p> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <pre> | 
					
						
							| 
									
										
										
										
											2013-04-04 16:36:10 +11:00
										 |  |  | $ <b>export PATH=$PATH:$GOPATH/bin</b> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | </pre> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <h3 id="PackagePaths">Package paths</h3> | 
					
						
							| 
									
										
										
										
											2012-03-02 15:35:36 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | <p> | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | The packages from the standard library are given short paths such as | 
					
						
							|  |  |  | <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 | 
					
						
							| 
									
										
										
										
											2013-04-04 08:19:24 +11:00
										 |  |  | <code>$HOME/go/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> | 
					
						
							|  |  |  | Initialized empty Git repository in /home/user/go/src/github.com/user/hello/.git/ | 
					
						
							|  |  |  | $ <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> |