mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 00:30:57 +00:00 
			
		
		
		
	
		
			
	
	
		
			272 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			272 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|   | <!-- Programming FAQ --> | ||
|  | 
 | ||
|  | <h2 id="Pointers">Pointers and Allocation</h2> | ||
|  | 
 | ||
|  | <h3 id="pass_by_value"> | ||
|  | When are function paramters passed by value?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | Everything in Go is passed by value.  A function always gets a copy of the | ||
|  | thing being passed, as if there were an assignment statement assigning the | ||
|  | value to the parameter.  For instance, copying a pointer value makes a copy of | ||
|  | the pointer, not the data it points to.  | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | Map and slice values behave like pointers; they are descriptors that | ||
|  | contain pointers to the underlying map or slice data.  Copying a map or | ||
|  | slice value doesn't copy the data it points to.  Copying an interface value | ||
|  | makes a copy of the thing stored in the interface value.  If the interface | ||
|  | value holds a struct, copying the interface value makes a copy of the | ||
|  | struct.  If the interface value holds a pointer, copying the interface value | ||
|  | makes a copy of the pointer, but again not the data it points to.  | ||
|  | </p> | ||
|  | 
 | ||
|  | <h3 id="methods_on_values_or_pointers"> | ||
|  | Should I define methods on values or pointers?</h3> | ||
|  | 
 | ||
|  | <pre> | ||
|  | func (s *MyStruct) someMethod() { } // method on pointer | ||
|  | func (s MyStruct) someMethod() { }  // method on value | ||
|  | </pre> | ||
|  | 
 | ||
|  | <p> | ||
|  | When defining a method on a type, the receiver (<code>s</code> in the above | ||
|  | example) behaves exactly is if it were an argument to the method. Define the | ||
|  | method on a pointer type if you need the method to modify the data the receiver | ||
|  | points to. Otherwise, it is often cleaner to define the method on a value type. | ||
|  | </p> | ||
|  | 
 | ||
|  | <h3 id="new_and_make"> | ||
|  | What's the difference between new and make?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | In short: <code>new</code> allocates memory, <code>make</code> initializes | ||
|  | the slice, map, and channel types. | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | See the <a href="/doc/effective_go.html#allocation_new">relevant section | ||
|  | of Effective Go</a> for more details. | ||
|  | </p> | ||
|  | 
 | ||
|  | <h3 id="64bit_machine_32bit_int"> | ||
|  | Why is <code>int</code> 32 bits on 64 bit machines?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | The size of <code>int</code> and <code>float</code> is implementation-specific. | ||
|  | The 64 bit Go compilers (both 6g and gccgo) use a 32 bit representation for | ||
|  | both <code>int</code> and <code>float</code>.  Code that relies on a particular | ||
|  | size of value should use an explicitly sized type, like <code>int64</code> or | ||
|  | <code>float64</code>. | ||
|  | </p> | ||
|  | 
 | ||
|  | <h2 id="Concurrent_programming">Concurrent programming</h2> | ||
|  | 
 | ||
|  | <h3 id="What_operations_are_atomic_What_about_mutexes"> | ||
|  | What operations are atomic? What about mutexes?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | We haven't fully defined it all yet, but some details about atomicity are | ||
|  | available in the <a href="go_mem.html">Go Memory Model specification</a>. | ||
|  | Also, some concurrency questions are answered in more detail in the <a | ||
|  | href="go_lang_faq.html">language design FAQ</a>. | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | Regarding mutexes, the <a href="/pkg/sync">sync</a> | ||
|  | package implements them, but we hope Go programming style will | ||
|  | encourage people to try higher-level techniques. In particular, consider | ||
|  | structuring your program so that only one goroutine at a time is ever | ||
|  | responsible for a particular piece of data. | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | Do not communicate by sharing memory. Instead, share memory by communicating. | ||
|  | </p> | ||
|  | 
 | ||
|  | <h3 id="Why_no_multi_CPU"> | ||
|  | Why doesn't my multi-goroutine program use multiple CPUs?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | Under the gc compilers you must set <code>GOMAXPROCS</code> to allow the | ||
|  | runtime to utilise more than one OS thread. Under <code>gccgo</code> an OS | ||
|  | thread will be created for each goroutine, and <code>GOMAXPROCS</code> is | ||
|  | effectively equal to the number of running goroutines.   | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | Programs that perform concurrent computation should benefit from an increase in | ||
|  | <code>GOMAXPROCS</code>. (See the <a | ||
|  | href="http://golang.org/pkg/runtime/#GOMAXPROCS">runtime package | ||
|  | documentation</a>.) | ||
|  | </p> | ||
|  | 
 | ||
|  | <h3 id="Why_GOMAXPROCS"> | ||
|  | Why does using <code>GOMAXPROCS</code> > 1 sometimes make my program | ||
|  | slower?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | (This is specific to the gc compilers. See above.) | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | It depends on the nature of your program.  | ||
|  | Programs that contain several goroutines that spend a lot of time | ||
|  | communicating on channels will experience performance degradation when using | ||
|  | multiple OS threads. This is because of the significant context-switching | ||
|  | penalty involved in sending data between threads. | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | The Go runtime's scheduler is not as good as it needs to be. In future, it | ||
|  | should recognise such cases and optimize its use of OS threads. For now, | ||
|  | <code>GOMAXPROCS</code> should be set on a per-application basis. | ||
|  | </p> | ||
|  | 
 | ||
|  | 
 | ||
|  | <h2 id="Closures">Closures</h2> | ||
|  | 
 | ||
|  | <h3 id="closures_and_goroutines"> | ||
|  | Why am I confused by the way my closures behave as goroutines?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | Some confusion may arise when using closures with concurrency. | ||
|  | Consider the following program: | ||
|  | </p> | ||
|  | 
 | ||
|  | <pre> | ||
|  | func main() { | ||
|  | 	done := make(chan bool) | ||
|  | 
 | ||
|  | 	values = []string{ "a", "b", "c" } | ||
|  | 	for _, v := range values { | ||
|  | 		go func() { | ||
|  | 			fmt.Println(v) | ||
|  | 			done <- true | ||
|  | 		}() | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// wait for all goroutines to complete before exiting | ||
|  | 	for i := range values { | ||
|  | 		<-done  | ||
|  | 	} | ||
|  | } | ||
|  | </pre> | ||
|  | 
 | ||
|  | <p> | ||
|  | One might mistakenly expect to see <code>a, b, c</code> as the output.  | ||
|  | What you'll probably see instead is <code>c, c, c</code>.  This is because  | ||
|  | each closure shares the same variable <code>v</code>. Each closure prints the  | ||
|  | value of <code>v</code> at the time <code>fmt.Println</code> is executed,  | ||
|  | rather than the value of <code>v</code> when the goroutine was launched.  | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | To bind the value of <code>v</code> to each closure as they are launched, one | ||
|  | could modify the inner loop to read: | ||
|  | </p> | ||
|  | 
 | ||
|  | <pre> | ||
|  | 	for _, v := range values { | ||
|  | 		go func(<b>u</b>) { | ||
|  | 			fmt.Println(<b>u</b>) | ||
|  | 			done <- true | ||
|  | 		}(<b>v</b>) | ||
|  | 	} | ||
|  | </pre> | ||
|  | 
 | ||
|  | <p> | ||
|  | In this example, the value of <code>v</code> is passed as an argument to the  | ||
|  | anonymous function. That value is then accessible inside the function as | ||
|  | the variable <code>u</code>. | ||
|  | </p> | ||
|  | 
 | ||
|  | <h2 id="Control_flow">Control flow</h2> | ||
|  | 
 | ||
|  | <h3 id="Does_Go_have_a_ternary_form"> | ||
|  | Does Go have the <code>?:</code> operator?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | There is no ternary form in Go. You may use the following to achieve the same | ||
|  | result: | ||
|  | </p> | ||
|  | 
 | ||
|  | <pre> | ||
|  | if expr { | ||
|  | 	n = trueVal | ||
|  | } else { | ||
|  | 	n = falseVal | ||
|  | } | ||
|  | </pre> | ||
|  | 
 | ||
|  | <h2 id="Packages_Testing">Packages and Testing</h2> | ||
|  | 
 | ||
|  | <h3 id="How_do_I_create_a_multifile_package"> | ||
|  | How do I create a multifile package?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | Put all the source files for the package in a directory by themselves. | ||
|  | Source files can refer to items from different files at will; there is | ||
|  | no need for forward declarations or a header file. | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | Other than being split into multiple files, the package will compile and test | ||
|  | just like a single-file package. | ||
|  | </p> | ||
|  | 
 | ||
|  | <h3 id="How_do_I_write_a_unit_test"> | ||
|  | How do I write a unit test?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | Create a new file ending in <code>_test.go</code> in the same directory | ||
|  | as your package sources. Inside that file, <code>import "testing"</code> | ||
|  | and write functions of the form | ||
|  | </p> | ||
|  | 
 | ||
|  | <pre> | ||
|  | func TestFoo(t *testing.T) { | ||
|  |     ... | ||
|  | } | ||
|  | </pre> | ||
|  | 
 | ||
|  | <p> | ||
|  | Run <code>gotest</code> in that directory. | ||
|  | That script finds the <code>Test</code> functions, | ||
|  | builds a test binary, and runs it. | ||
|  | </p> | ||
|  | 
 | ||
|  | 
 | ||
|  | <h2 id="Data_structures">Data Structures</h2> | ||
|  | 
 | ||
|  | <h3 id="nested_array_verbose" | ||
|  | >Why does the syntax for nested array literals seem overly verbose?</h3> | ||
|  | 
 | ||
|  | <p> | ||
|  | In Go, you must specify a 2-dimensional array literal like this: | ||
|  | </p> | ||
|  | 
 | ||
|  | <pre> | ||
|  | var intArray = [4][4]int{ | ||
|  | 	[4]int{1, 2, 3, 4}, | ||
|  | 	[4]int{2, 4, 8, 16}, | ||
|  | 	[4]int{3, 9, 27, 81}, | ||
|  | 	[4]int{4, 16, 64, 256}, | ||
|  | } | ||
|  | </pre> | ||
|  | 
 | ||
|  | <p> | ||
|  | It seems that the <code>[4]int</code> could be inferred, but in general it's | ||
|  | hard to get this sort of thing right. | ||
|  | </p> | ||
|  | 
 | ||
|  | <p> | ||
|  | Some of Go's designers had worked on other languages that derived types | ||
|  | automatically in such expressions, but the special cases that arise can | ||
|  | be messy, especially when interfaces, nil, constant conversions, and | ||
|  | such are involved. It seemed better to require the full type | ||
|  | information. That way there will be no surprises. | ||
|  | </p> | ||
|  | 
 |