From: Andrew Gerrand
-Cgo lets Go packages call C code. Given a Go source file written with some
-special features, cgo outputs Go and C files that can be combined into a
-single Go package.
-
-To lead with an example, here's a Go package that provides two functions -
-
-Let's look at what's happening here, starting with the import statement.
-
-The
-The
-The
-Here's an equivalent function that uses a temporary variable to illustrate
-the type conversion more explicitly:
-
-The
-Note that cgo knows the
-The one detail of this example we haven't examined yet is the comment
-above the
-Cgo recognizes this comment. Any lines starting
-with
-There is a limitation: if your program uses any
-The
-Strings and things
-
-Unlike Go, C doesn't have an explicit string type. Strings in C are
-represented by a zero-terminated array of chars.
-
-Conversion between Go and C strings is done with the
-
-This next example implements a
-Memory allocations made by C code are not known to Go's memory manager.
-When you create a C string with
-The call to
-Building cgo packages
-
-To build cgo packages, just use "
-
-More cgo resources
-
-The cgo command documentation has more detail about
-the C pseudo-package and the build process. The cgo examples
-in the Go tree demonstrate more advanced concepts.
-
-For a simple, idiomatic example of a cgo-based package, see Russ Cox's gosqlite.
-Also, the Go Community Wiki
-lists many packages, some of which use cgo.
-
-Finally, if you're curious as to how all this works internally, take a look
-at the introductory comment of the runtime package's cgocall.c.
-
-Concurrent programming has its own idioms. A good example is timeouts. Although
-Go's channels do not support them directly, they are easy to implement. Say we
-want to receive from the channel
-We can then use a
-The
-(In this example we used
-Let's look at another variation of this pattern. In this example we have a
-program that reads from multiple replicated databases simultaneously. The
-program needs only one of the answers, and it should accept the answer that
-arrives first.
-
-The function
-In this example, the closure does a non-blocking send, which it achieves by
-using the send operation in
-This problem is a textbook example of what is known as a
-race condition, but
-the fix is trivial. We just make sure to buffer the channel
-These two examples demonstrate the simplicity with which Go can express complex
-interactions between goroutines.
-
-Go has the usual mechanisms for control flow: if, for, switch, goto. It also
-has the go statement to run code in a separate goroutine. Here I'd like to
-discuss some of the less common ones: defer, panic, and recover.
-
-A defer statement pushes a function call onto a list. The list of saved
-calls is executed after the surrounding function returns. Defer is commonly
-used to simplify functions that perform various clean-up actions.
-
-For example, let's look at a function that opens two files and copies the
-contents of one file to the other:
-
-This works, but there is a bug. If the call to os.Create fails, the
-function will return without closing the source file. This can be easily
-remedied by putting a call to src.Close before the second return statement,
-but if the function were more complex the problem might not be so easily
-noticed and resolved. By introducing defer statements we can ensure that the
-files are always closed:
-
-Defer statements allow us to think about closing each file right after opening
-it, guaranteeing that, regardless of the number of return statements in the
-function, the files will be closed.
-
-The behavior of defer statements is straightforward and predictable. There are
-three simple rules:
-
-1. A deferred function's arguments are evaluated when the defer statement is
-evaluated.
-
-In this example, the expression "i" is evaluated when the Println call is
-deferred. The deferred call will print "0" after the function returns.
-
-2. Deferred function calls are executed in Last In First Out order
-after the surrounding function returns.
-
-This function prints "3210":
-
-3. Deferred functions may read and assign to the returning function's named
-return values.
-
-In this example, a deferred function increments the return value i after
-the surrounding function returns. Thus, this function returns 2:
-
-This is convenient for modifying the error return value of a function; we will
-see an example of this shortly.
-
-Panic is a built-in function that stops the ordinary flow of control and
-begins panicking. When the function F calls panic, execution of F stops,
-any deferred functions in F are executed normally, and then F returns to its
-caller. To the caller, F then behaves like a call to panic. The process
-continues up the stack until all functions in the current goroutine have
-returned, at which point the program crashes. Panics can be initiated by
-invoking panic directly. They can also be caused by runtime errors, such as
-out-of-bounds array accesses.
-
-Recover is a built-in function that regains control of a panicking
-goroutine. Recover is only useful inside deferred functions. During normal
-execution, a call to recover will return nil and have no other effect. If the
-current goroutine is panicking, a call to recover will capture the value given
-to panic and resume normal execution.
-
-Here's an example program that demonstrates the mechanics of panic and defer:
-
-The function g takes the int i, and panics if i is greater than 3, or else it
-calls itself with the argument i+1. The function f defers a function that calls
-recover and prints the recovered value (if it is non-nil). Try to picture what
-the output of this program might be before reading on.
-
-The program will output:
-
-If we remove the deferred function from f the panic is not recovered and
-reaches the top of the goroutine's call stack, terminating the program. This
-modified program will output:
-
-For a real-world example of panic and recover, see the
-json package from the Go standard library.
-It decodes JSON-encoded data with a set of recursive functions.
-When malformed JSON is encountered, the parser calls panic to unwind the
-stack to the top-level function call, which recovers from the panic and returns
-an appropriate error value (see the 'error' and 'unmarshal' methods of
-the decodeState type in
-decode.go).
-
-The convention in the Go libraries is that even when a package uses panic
-internally, its external API still presents explicit error return values.
-
-Other uses of defer (beyond the file.Close example given earlier)
-include releasing a mutex:
-
-printing a footer:
-
-and more.
-
-In summary, the defer statement (with or without panic and recover) provides an
-unusual and powerful mechanism for control flow. It can be used to model a
-number of features implemented by special-purpose structures in other
-programming languages. Try it out.
-
-If you have written any Go code you have probably encountered the built-in
-
-The following code uses
-You can get a lot done in Go knowing just this about the
-The error type
-
-The
-The
-The most commonly-used
-You can construct one of these values with the
-Here's how you might use
-A caller passing a negative argument to
-The fmt package formats an
-It is the error implementation's responsibility to summarize the context.
-The error returned by
-To add that information, a useful function is the
-In many cases
-For instance, our hypothetical callers might want to recover the invalid
-argument passed to
-A sophisticated caller can then use a
-type assertion to check for a
-
-As another example, the json package specifies a
-
-The
-(This is a slightly simplified version of some
-actual code
-from the Camlistore project.)
-
-The
-Client code can test for a
-Simplifying repetitive error handling
-
-In Go, error handling is important. The language's design and conventions
-encourage you to explicitly check for errors where they occur (as distinct from
-the convention in other languages of throwing exceptions and sometimes catching
-them). In some cases this makes Go code verbose, but fortunately there are some
-techniques you can use to minimize repetitive error handling.
-
-Consider an App Engine
-application with an HTTP handler that retrieves a record from the datastore and
-formats it with a template.
-
-This function handles errors returned by the
-To reduce the repetition we can define our own HTTP
-Then we can change our
-This is simpler than the original version, but the http package doesn't understand functions that return
-
-The
-Now when registering
-With this basic error handling infrastructure in place, we can make it more
-user friendly. Rather than just displaying the error string, it would be better
-to give the user a simple error message with an appropriate HTTP status code,
-while logging the full error to the App Engine developer console for debugging
-purposes.
-
-To do this we create an
-Next we modify the appHandler type to return
-(It's usually a mistake to pass back the concrete type of an error rather than
-
-And make
-Finally, we update
-This version of
-It doesn't end there; we can further improve the error handling in our
-application. Some ideas:
-
-Conclusion
-
-Proper error handling is an essential requirement of good software. By
-employing the techniques described in this post you should be able to write
-more reliable and succinct Go code.
-
-To transmit a data structure across a network or to store it in a file, it must
-be encoded and then decoded again. There are many encodings available, of
-course: JSON,
-XML, Google's
-protocol buffers, and more.
-And now there's another, provided by Go's gob
-package.
-
-Why define a new encoding? It's a lot of work and redundant at that. Why not
-just use one of the existing formats? Well, for one thing, we do! Go has
-packages supporting all the encodings just mentioned (the
-protocol buffer package is in
-a separate repository but it's one of the most frequently downloaded). And for
-many purposes, including communicating with tools and systems written in other
-languages, they're the right choice.
-
-But for a Go-specific environment, such as communicating between two servers
-written in Go, there's an opportunity to build something much easier to use and
-possibly more efficient.
-
-Gobs work with the language in a way that an externally-defined,
-language-independent encoding cannot. At the same time, there are lessons to be
-learned from the existing systems.
-
-Goals
-
-The gob package was designed with a number of goals in mind.
-
-First, and most obvious, it had to be very easy to use. First, because Go has
-reflection, there is no need for a separate interface definition language or
-"protocol compiler". The data structure itself is all the package should need
-to figure out how to encode and decode it. On the other hand, this approach
-means that gobs will never work as well with other languages, but that's OK:
-gobs are unashamedly Go-centric.
-
-Efficiency is also important. Textual representations, exemplified by XML and
-JSON, are too slow to put at the center of an efficient communications network.
-A binary encoding is necessary.
-
-Gob streams must be self-describing. Each gob stream, read from the beginning,
-contains sufficient information that the entire stream can be parsed by an
-agent that knows nothing a priori about its contents. This property means that
-you will always be able to decode a gob stream stored in a file, even long
-after you've forgotten what data it represents.
-
-There were also some things to learn from our experiences with Google protocol
-buffers.
-
-Protocol buffer misfeatures
-
-Protocol buffers had a major effect on the design of gobs, but have three
-features that were deliberately avoided. (Leaving aside the property that
-protocol buffers aren't self-describing: if you don't know the data definition
-used to encode a protocol buffer, you might not be able to parse it.)
-
-First, protocol buffers only work on the data type we call a struct in Go. You
-can't encode an integer or array at the top level, only a struct with fields
-inside it. That seems a pointless restriction, at least in Go. If all you want
-to send is an array of integers, why should you have to put it into a
-struct first?
-
-Next, a protocol buffer definition may specify that fields
-The third protocol buffer misfeature is default values. If a protocol buffer
-omits the value for a "defaulted" field, then the decoded structure behaves as
-if the field were set to that value. This idea works nicely when you have
-getter and setter methods to control access to the field, but is harder to
-handle cleanly when the container is just a plain idiomatic struct. Required
-fields are also tricky to implement: where does one define the default values,
-what types do they have (is text UTF-8? uninterpreted bytes? how many bits in a
-float?) and despite the apparent simplicity, there were a number of
-complications in their design and implementation for protocol buffers. We
-decided to leave them out of gobs and fall back to Go's trivial but effective
-defaulting rule: unless you set something otherwise, it has the "zero value"
-for that type - and it doesn't need to be transmitted.
-
-So gobs end up looking like a sort of generalized, simplified protocol buffer.
-How do they work?
-
-Values
-
-The encoded gob data isn't about
-This flexibility also applies to pointers. Before transmission, all pointers are
-flattened. Values of type
-Flexibility also happens because, when decoding a struct, only those fields
-that are sent by the encoder are stored in the destination. Given the value
-
-the encoding of
-The receiver could instead decode the value into this structure:
-
-and acquire a value of
-From integers we can build all the other types: bytes, strings, arrays, slices,
-maps, even floats. Floating-point values are represented by their IEEE 754
-floating-point bit pattern, stored as an integer, which works fine as long as
-you know their type, which we always do. By the way, that integer is sent in
-byte-reversed order because common values of floating-point numbers, such as
-small integers, have a lot of zeros at the low end that we can avoid
-transmitting.
-
-One nice feature of gobs that Go makes possible is that they allow you to define
-your own encoding by having your type satisfy the
-GobEncoder and
-GobDecoder interfaces, in a manner
-analogous to the JSON package's
-Marshaler and
-Unmarshaler and also to the
-Stringer interface from
-package fmt. This facility makes it possible to
-represent special features, enforce constraints, or hide secrets when you
-transmit data. See the documentation for
-details.
-
-Types on the wire
-
-The first time you send a given type, the gob package includes in the data
-stream a description of that type. In fact, what happens is that the encoder is
-used to encode, in the standard gob encoding format, an internal struct that
-describes the type and gives it a unique number. (Basic types, plus the layout
-of the type description structure, are predefined by the software for
-bootstrapping.) After the type is described, it can be referenced by its type
-number.
-
-Thus when we send our first type
-These type numbers make it possible to describe recursive types and send values
-of those types. Thus gobs can encode types such as trees:
-
-(It's an exercise for the reader to discover how the zero-defaulting rule makes
-this work, even though gobs don't represent pointers.)
-
-With the type information, a gob stream is fully self-describing except for the
-set of bootstrap types, which is a well-defined starting point.
-
-Compiling a machine
-
-The first time you encode a value of a given type, the gob package builds a
-little interpreted machine specific to that data type. It uses reflection on
-the type to construct that machine, but once the machine is built it does not
-depend on reflection. The machine uses package unsafe and some trickery to
-convert the data into the encoded bytes at high speed. It could use reflection
-and avoid unsafe, but would be significantly slower. (A similar high-speed
-approach is taken by the protocol buffer support for Go, whose design was
-influenced by the implementation of gobs.) Subsequent values of the same type
-use the already-compiled machine, so they can be encoded right away.
-
-Decoding is similar but harder. When you decode a value, the gob package holds
-a byte slice representing a value of a given encoder-defined type to decode,
-plus a Go value into which to decode it. The gob package builds a machine for
-that pair: the gob type sent on the wire crossed with the Go type provided for
-decoding. Once that decoding machine is built, though, it's again a
-reflectionless engine that uses unsafe methods to get maximum speed.
-
-Use
-
-There's a lot going on under the hood, but the result is an efficient,
-easy-to-use encoding system for transmitting data. Here's a complete example
-showing differing encoded and decoded types. Note how easy it is to send and
-receive values; all you need to do is present values and variables to the
-gob package and it does all the work.
-
-You can compile and run this example code in the
-Go Playground.
-
-The rpc package builds on gobs to turn this
-encode/decode automation into transport for method calls across the network.
-That's a subject for another article.
-
-Details
-
-The gob package documentation, especially the
-file doc.go, expands on many of the
-details described here and includes a full worked example showing how the
-encoding represents data. If you are interested in the innards of the gob
-implementation, that's a good place to start.
-
-The Go project takes documentation seriously. Documentation is a huge part of
-making software accessible and maintainable. Of course it must be well-written
-and accurate, but it also must be easy to write and to maintain. Ideally, it
-should be coupled to the code itself so the documentation evolves along with the
-code. The easier it is for programmers to produce good documentation, the better
-for everyone.
-
-To that end, we have developed the godoc documentation
-tool. This article describes godoc's approach to documentation, and explains how
-you can use our conventions and tools to write good documentation for your own
-projects.
-
-Godoc parses Go source code - including comments - and produces documentation as
-HTML or plain text. The end result is documentation tightly coupled with the
-code it documents. For example, through godoc's web interface you can navigate
-from a function's documentation to its
-implementation with one click.
-
-Godoc is conceptually related to Python's
-Docstring and Java's
-Javadoc,
-but its design is simpler. The comments read by godoc are not language
-constructs (as with Docstring) nor must they have their own machine-readable
-syntax (as with Javadoc). Godoc comments are just good comments, the sort you
-would want to read even if godoc didn't exist.
-
-The convention is simple: to document a type, variable, constant, function, or
-even a package, write a regular comment directly preceding its declaration, with
-no intervening blank line. Godoc will then present that comment as text
-alongside the item it documents. For example, this is the documentation for the
-
-Notice this comment is a complete sentence that begins with the name of the
-element it describes. This important convention allows us to generate
-documentation in a variety of formats, from plain text to HTML to UNIX man
-pages, and makes it read better when tools truncate it for brevity, such as when
-they extract the first line or sentence.
-
-Comments on package declarations should provide general package documentation.
-These comments can be short, like the
-They can also be detailed like the
-When writing package comments of any size, keep in mind that their first
-sentence will appear in godoc's package list.
-
-Comments that are not adjacent to a top-level declaration are omitted from
-godoc's output, with one notable exception. Top-level comments that begin with
-the word
-Godoc treats executable commands in the same way. It looks for a comment on
-package main, which is sometimes put in a separate file called
-There are a few formatting rules that Godoc uses when converting comments to
-HTML:
-
-Note that none of these rules requires you to do anything out of the ordinary.
-
-In fact, the best thing about godoc's minimal approach is how easy it is to use.
-As a result, a lot of Go code, including all of the standard library, already
-follows the conventions.
-
-Your own code can present good documentation just by having comments as
-described above. Any Go packages installed inside
-Godoc recognizes example functions written according to the
-
-Newcomers to Go wonder why the declaration syntax is different from the
-tradition established in the C family. In this post we'll compare the
-two approaches and explain why Go's declarations look as they do.
-
-C syntax
-
-First, let's talk about C syntax. C took an unusual and clever approach
-to declaration syntax. Instead of describing the types with special
-syntax, one writes an expression involving the item being declared, and
-states what type that expression will have. Thus
-
-declares x to be an int: the expression 'x' will have type int. In
-general, to figure out how to write the type of a new variable, write an
-expression involving that variable that evaluates to a basic type, then
-put the basic type on the left and the expression on the right.
-
-Thus, the declarations
-
-state that p is a pointer to int because '*p' has type int, and that a
-is an array of ints because a[3] (ignoring the particular index value,
-which is punned to be the size of the array) has type int.
-
-What about functions? Originally, C's function declarations wrote the
-types of the arguments outside the parens, like this:
-
-Again, we see that main is a function because the expression main(argc,
-argv) returns an int. In modern notation we'd write
-
-but the basic structure is the same.
-
-This is a clever syntactic idea that works well for simple types but can
-get confusing fast. The famous example is declaring a function pointer.
-Follow the rules and you get this:
-
-Here, fp is a pointer to a function because if you write the expression
-(*fp)(a, b) you'll call a function that returns int. What if one of fp's
-arguments is itself a function?
-
-That's starting to get hard to read.
-
-Of course, we can leave out the name of the parameters when we declare a
-function, so main can be declared
-
-Recall that argv is declared like this,
-
-so you drop the name from the middle of its declaration to construct
-its type. It's not obvious, though, that you declare something of type
-char *[] by putting its name in the middle.
-
-And look what happens to fp's declaration if you don't name the
-parameters:
-
-Not only is it not obvious where to put the name inside
-
-it's not exactly clear that it's a function pointer declaration at all.
-And what if the return type is a function pointer?
-
-It's hard even to see that this declaration is about fp.
-
-You can construct more elaborate examples but these should illustrate
-some of the difficulties that C's declaration syntax can introduce.
-
-There's one more point that needs to be made, though. Because type and
-declaration syntax are the same, it can be difficult to parse
-expressions with types in the middle. This is why, for instance, C casts
-always parenthesize the type, as in
-
-Go syntax
-
-Languages outside the C family usually use a distinct type syntax in
-declarations. Although it's a separate point, the name usually comes
-first, often followed by a colon. Thus our examples above become
-something like (in a fictional but illustrative language)
-
-These declarations are clear, if verbose - you just read them left to
-right. Go takes its cue from here, but in the interests of brevity it
-drops the colon and removes some of the keywords:
-
-There is no direct correspondence between the look of [3]int and how to
-use a in an expression. (We'll come back to pointers in the next
-section.) You gain clarity at the cost of a separate syntax.
-
-Now consider functions. Let's transcribe the declaration for main, even
-though the main function in Go takes no arguments:
-
-Superficially that's not much different from C, but it reads well from
-left to right:
-
-function main takes an int and a pointer to a slice of bytes and returns an int.
-
-Drop the parameter names and it's just as clear - they're always first
-so there's no confusion.
-
-One value of this left-to-right style is how well it works as the types
-become more complex. Here's a declaration of a function variable
-(analogous to a function pointer in C):
-
-Or if f returns a function:
-
-It still reads clearly, from left to right, and it's always obvious
-which name is being declared - the name comes first.
-
-The distinction between type and expression syntax makes it easy to
-write and invoke closures in Go:
-
-Pointers
-
-Pointers are the exception that proves the rule. Notice that in arrays
-and slices, for instance, Go's type syntax puts the brackets on the left
-of the type but the expression syntax puts them on the right of the
-expression:
-
-For familiarity, Go's pointers use the * notation from C, but we could
-not bring ourselves to make a similar reversal for pointer types. Thus
-pointers work like this
-
-We couldn't say
-
-because that postfix * would conflate with multiplication. We could have
-used the Pascal ^, for example:
-
-and perhaps we should have (and chosen another operator for xor),
-because the prefix asterisk on both types and expressions complicates
-things in a number of ways. For instance, although one can write
-
-as a conversion, one must parenthesize the type if it starts with a *:
-
-Had we been willing to give up * as pointer syntax, those parentheses
-would be unnecessary.
-
-So Go's pointer syntax is tied to the familiar C form, but those ties
-mean that we cannot break completely from using parentheses to
-disambiguate types and expressions in the grammar.
-
-Overall, though, we believe Go's type syntax is easier to understand
-than C's, especially when things get complicated.
-
-Notes
-
-Go's declarations read left to right. It's been pointed out that C's
-read in a spiral! See
-The "Clockwise/Spiral Rule" by David Anderson.
-
-Package image/draw defines
-only one operation: drawing a source image onto a destination
-image, through an optional mask image. This one operation is
-surprisingly versatile and can perform a number of common image
-manipulation tasks elegantly and efficiently.
-
-Composition is performed pixel by pixel in the style of the Plan 9
-graphics library and the X Render extension. The model is based on
-the classic "Compositing Digital Images" paper by Porter and Duff,
-with an additional mask parameter:
-The Porter-Duff paper presented
-12 different composition operators,
-but with an explicit mask, only 2 of these are needed in practice:
-source-over-destination and source. In Go, these operators are
-represented by the Geometric Alignment
-Composition requires associating destination pixels with source and
-mask pixels. Obviously, this requires destination, source and mask
-images, and a composition operator, but it also requires specifying
-what rectangle of each image to use. Not every drawing should write
-to the entire destination: when updating an animating image, it is
-more efficient to only draw the parts of the image that have
-changed. Not every drawing should read from the entire source: when
-using a sprite that combines many small images into one large one,
-only a part of the image is needed. Not every drawing should read
-from the entire mask: a mask image that collects a font's glyphs is
-similar to a sprite. Thus, drawing also needs to know three
-rectangles, one for each image. Since each rectangle has the same
-width and height, it suffices to pass a destination rectangle `r`
-and two points
-
-The
-The destination image must be mutable, so the image/draw package
-defines a Filling a Rectangle
-To fill a rectangle with a solid color, use an
-To initialize a new image to all-blue:
-
-To reset an image to transparent (or black, if the destination
-image's color model cannot represent transparency), use
-
- Copying an Image
-To copy from a rectangle
-Alternatively:
-
-To copy the entire source image, use
- Scrolling an Image
-Scrolling an image is just copying an image to itself, with
-different destination and source rectangles. Overlapping
-destination and source images are perfectly valid, just as Go's
-built-in copy function can handle overlapping destination and
-source slices. To scroll an image m by 20 pixels:
- Converting an Image to RGBA
-The result of decoding an image format might not be an
-
- Drawing Through a Mask
-To draw an image through a circular mask with center
- Drawing Font Glyphs
-To draw a font glyph in blue starting from a point
- Performance
-The image/draw package implementation demonstrates how to provide
-an image manipulation function that is both general purpose, yet
-efficient for common cases. The
-The image and
-image/color packages define a number of types:
-
-Colors and Color Models
-
-Color is an interface that defines the minimal
-method set of any type that can be considered a color: one that can be converted
-to red, green, blue and alpha values. The conversion may be lossy, such as
-converting from CMYK or YCbCr color spaces.
-
-There are three important subtleties about the return values. First, the red,
-green and blue are alpha-premultiplied: a fully saturated red that is also 25%
-transparent is represented by RGBA returning a 75% r. Second, the channels have
-a 16-bit effective range: 100% red is represented by RGBA returning an r of
-65535, not 255, so that converting from CMYK or YCbCr is not as lossy. Third,
-the type returned is
-The last line of that code snippet would have been more complicated if we worked
-with non-alpha-premultiplied colors, which is why
-The image/color package also defines a number of concrete types that implement
-the
-Note that the
-A
-Points and Rectangles
-
-A
-
-A
-For convenience,
-A
-
-Adding a
-
-Intersecting two Rectangles yields another Rectangle, which may be empty.
-
-
-Points and Rectangles are passed and returned by value. A function that takes a
-
-Images
-
-An Image maps every grid square in a
-
-A common mistake is assuming that an
-
-Typically, though, programs will want an image based on a slice. Struct types
-like
-These types also provide a
-If you're reading or writing a lot of pixel data, it can be more efficient, but
-more complicated, to access these struct type's
-The slice-based
-For low-level code that works on an image's
-Image Formats
-
-The standard package library supports a number of common image formats, such as
-GIF, JPEG and PNG. If you know the format of a source image file, you can
-decode from an
-If you have image data of unknown format, the
-
-See the Documents page for a complete list of Go articles.
+See the Documents page and the
+Blog index for a complete list of Go articles.
-JSON (JavaScript Object Notation) is a simple data interchange format.
-Syntactically it resembles the objects and lists of JavaScript. It is most
-commonly used for communication between web back-ends and JavaScript programs
-running in the browser, but it is used in many other places, too. Its home page,
-json.org, provides a wonderfully clear and concise
-definition of the standard.
-
-With the json package it's a snap to read and
-write JSON data from your Go programs.
-
-Encoding
-
-To encode JSON data we use the
-
-Given the Go data structure,
-and an instance of
-we can marshal a JSON-encoded version of
-If all is well,
-Only data structures that can be represented as valid JSON will be encoded:
-
-The json package only accesses the exported fields of struct types (those that
-begin with an uppercase letter). Therefore only the exported fields of a struct
-will be present in the JSON output.
-
-Decoding
-
-To decode JSON data we use the
-
-We must first create a place where the decoded data will be stored
-
-and call
-If
-How does
-What happens when the structure of the JSON data doesn't exactly match the Go
-type?
-
-
-But what if you don't know the structure of your JSON data beforehand?
-
-Generic JSON with
-The
-The empty interface serves as a general container type:
-
-A type assertion accesses the underlying concrete type:
-
-Or, if the underlying type is unknown, a type switch determines the type:
-
-The json package uses
-Decoding arbitrary data
-
-Consider this JSON data, stored in the variable
-Without knowing this data's structure, we can decode it into an
-
-At this point the Go value in
-To access this data we can use a type assertion to access
-We can then iterate through the map with a range statement and use a type switch
-to access its values as their concrete types:
-
-In this way you can work with unknown JSON data while still enjoying the
-benefits of type safety.
-
-Reference Types
-
-Let's define a Go type to contain the data from the previous example:
-
-Unmarshaling that data into a
-Consider unmarshaling into this data structure:
-
-If there were a
-From this a useful pattern arises: if you have an application that receives a
-few distinct message types, you might define "receiver" structure like
-
-and the sending party can populate the
-Streaming Encoders and Decoders
-
-The json package provides
-Here's an example program that reads a series of JSON objects from standard
-input, removes all but the
-Due to the ubiquity of Readers and Writers, these
-References
-
-For more information see the json package documentation. For an example usage of
-json see the source files of the jsonrpc package.
-
-Here we present an example where Go's
-interfaces made it
-easy to refactor some existing code to make it more flexible and extensible.
-Originally, the standard library's RPC package used
-a custom wire format called gob. For a
-particular application, we wanted to use JSON
-as an alternate wire format.
-
-We first defined a pair of interfaces to describe the functionality of the
-existing wire format, one for the client, and one for the server (depicted
-below).
-
-On the server side, we then changed two internal function signatures to accept
-the
-became
-
-We then wrote a trivial
-After some similar changes to the client side, this was the full extent of the
-work we needed to do on the RPC package. This whole exercise took about 20
-minutes! After tidying up and testing the new code, the
-final changeset
-was submitted.
-
-In an inheritance-oriented language like Java or C++, the obvious path would be
-to generalize the RPC class, and create JsonRPC and GobRPC subclasses. However,
-this approach becomes tricky if you want to make a further generalization
-orthogonal to that hierarchy. (For example, if you were to implement an
-alternate RPC standard). In our Go package, we took a route that is both
-conceptually simpler and requires less code be written or changed.
-
-A vital quality for any codebase is maintainability. As needs change, it is
-essential to adapt your code easily and cleanly, lest it become unwieldy to work
-with. We believe Go's lightweight, composition-oriented type system provides a
-means of structuring code that scales.
-
-Reflection in computing is the
-ability of a program to examine its own structure, particularly
-through types; it's a form of metaprogramming. It's also a great
-source of confusion.
-
-In this article we attempt to clarify things by explaining how
-reflection works in Go. Each language's reflection model is
-different (and many languages don't support it at all), but
-this article is about Go, so for the rest of this article the word
-"reflection" should be taken to mean "reflection in Go".
- Types and interfaces
-Because reflection builds on the type system, let's start with a
-refresher about types in Go.
-
-Go is statically typed. Every variable has a static type, that is,
-exactly one type known and fixed at compile time:
-then
-One important category of type is interface types, which represent
-fixed sets of methods. An interface variable can store any concrete
-(non-interface) value as long as that value implements the
-interface's methods. A well-known pair of examples is
-
-Any type that implements a
-It's important to be clear that whatever concrete value
-
-An extremely important example of an interface type is the empty
-interface:
-
-It represents the empty set of methods and is satisfied by any
-value at all, since any value has zero or more methods.
-
-Some people say that Go's interfaces are dynamically typed, but
-that is misleading. They are statically typed: a variable of
-interface type always has the same static type, and even though at
-run time the value stored in the interface variable may change
-type, that value will always satisfy the interface.
-
-We need to be precise about all this because reflection and
-interfaces are closely related.
- The representation of an interface
-Russ Cox has written a
-detailed blog post
-about the representation of interface values in Go. It's not necessary to
-repeat the full story here, but a simplified summary is in order.
-
-A variable of interface type stores a pair: the concrete value
-assigned to the variable, and that value's type descriptor.
-To be more precise, the value is the underlying concrete data item
-that implements the interface and the type describes the full type
-of that item. For instance, after
-
-
-The expression in this assignment is a type assertion; what it
-asserts is that the item inside
-Continuing, we can do this:
-
-and our empty interface value,
-(We don't need a type assertion here because it's known statically
-that
-One important detail is that the pair inside an interface always
-has the form (value, concrete type) and cannot have the form
-(value, interface type). Interfaces do not hold interface
-values.
-
-Now we're ready to reflect.
- The first law of reflection 1. Reflection goes from interface value to reflection object.
-At the basic level, reflection is just a mechanism to examine the
-type and value pair stored inside an interface variable. To get
-started, there are two types we need to know about in
-package reflect:
-Type and
-Value. Those two types
-give access to the contents of an interface variable, and two
-simple functions, called
-Let's start with
-This program prints
-
-You might be wondering where the interface is here, since the program looks
-like it's passing the
-When we call
-The
-prints
-
-Both
-prints
-
-There are also methods like
-The reflection library has a couple of properties worth singling
-out. First, to keep the API simple, the "getter" and "setter"
-methods of
-The second property is that the
-the The second law of reflection 2. Reflection goes from reflection object to interface
-value.
-Like physical reflection, reflection in Go generates its own
-inverse.
-
-Given a
-As a consequence we can say
-
-to print the
-We can do even better, though. The arguments to
-
-(Why not
-and get in this case
-
-Again, there's no need to type-assert the result of
-
-In short, the
-Reiterating: Reflection goes from interface values to reflection
-objects and back again.
- The third law of reflection 3. To modify a reflection object, the value must be settable.
-The third law is the most subtle and confusing, but it's easy
-enough to understand if we start from first principles.
-
-Here is some code that does not work, but is worth studying.
-
-If you run this code, it will panic with the cryptic message
-
-The problem is not that the value
-The
-prints
-
-It is an error to call a
-Settability is a bit like addressability, but stricter. It's the
-property that a reflection object can modify the actual storage
-that was used to create the reflection object. Settability is
-determined by whether the reflection object holds the original
-item. When we say
-
-we pass a copy of
-were allowed to succeed, it would not update
-If this seems bizarre, it's not. It's actually a familiar situation
-in unusual garb. Think of passing
-We would not expect
-
-This is straightforward and familiar, and reflection works the same
-way. If we want to modify
-Let's do that. First we initialize
-The output so far is
-
-The reflection object
-Now
-and since it represents
-The output, as expected, is
-
-Reflection can be hard to understand but it's doing exactly what
-the language does, albeit through reflection Structs
-In our previous example
-Here's a simple example that analyzes a struct value,
-The output of this program is
-
-There's one more point about settability introduced in
-passing here: the field names of
-Because
-And here's the result:
-
-If we modified the program so that Conclusion
-Here again are the laws of reflection:
-
-Once you understand these laws reflection in Go becomes much easier
-to use, although it remains subtle. It's a powerful tool that
-should be used with care and avoided unless strictly
-necessary.
-
-There's plenty more to reflection that we haven't covered —
-sending and receiving on channels, allocating memory, using slices
-and maps, calling methods and functions — but this post is
-long enough. We'll cover some of those topics in a later
-article.
-
-Data races are among the most common and hardest to debug types of bugs in concurrent systems.
-A data race occurs when two goroutines access the same variable concurrently and at least one of the accesses is a write.
-See the The Go Memory Model for details.
-
-Here is an example of a data race that can lead to crashes and memory corruption:
-
-To help diagnose such bugs, Go includes a built-in data race detector.
-To use it, add the
-When the race detector finds a data race in the program, it prints a report.
-The report contains stack traces for conflicting accesses, as well as stacks where the involved goroutines were created.
-Here is an example:
-
-The
-The options are:
-
-Example:
-
-When you build with
-To start, run your tests using the race detector (
-Here are some typical data races. All of them can be detected with the race detector.
-
-The variable
-The fix is to introduce new variables in the goroutines (note the use of
-If the following code is called from several goroutines, it leads to races on the
-To make the code safe, protect the accesses with a mutex:
-
-Data races can happen on variables of primitive types as well (
-Even such "innocent" data races can lead to hard-to-debug problems caused by
-non-atomicity of the memory accesses,
-interference with compiler optimizations,
-or reordering issues accessing processor memory .
-
-A typical fix for this race is to use a channel or a mutex.
-To preserve the lock-free behavior, one can also use the
-
-The race detector runs on
-The cost of race detection varies by program, but for a typical program, memory
-usage may increase by 5-10x and execution time by 2-20x.
-
-Go's slice type provides a convenient and efficient means of working with
-sequences of typed data. Slices are analogous to arrays in other languages, but
-have some unusual properties. This article will look at what slices are and how
-they are used.
-
-Arrays
-
-The slice type is an abstraction built on top of Go's array type, and so to
-understand slices we must first understand arrays.
-
-An array type definition specifies a length and an element type. For example,
-the type
-Arrays do not need to be initialized explicitly; the zero value of an array is
-a ready-to-use array whose elements are themselves zeroed:
-
-The in-memory representation of
-
-Go's arrays are values. An array variable denotes the entire array; it is not a
-pointer to the first array element (as would be the case in C). This means
-that when you assign or pass around an array value you will make a copy of its
-contents. (To avoid the copy you could pass a pointer to the array, but
-then that's a pointer to an array, not an array.) One way to think about arrays
-is as a sort of struct but with indexed rather than named fields: a fixed-size
-composite value.
-
-An array literal can be specified like so:
-
-Or, you can have the compiler count the array elements for you:
-
-In both cases, the type of
-Slices
-
-Arrays have their place, but they're a bit inflexible, so you don't see them
-too often in Go code. Slices, though, are everywhere. They build on arrays to
-provide great power and convenience.
-
-The type specification for a slice is
-A slice literal is declared just like an array literal, except you leave out
-the element count:
-
-A slice can be created with the built-in function called
-where T stands for the element type of the slice to be created. The
-
-When the capacity argument is omitted, it defaults to the specified length.
-Here's a more succinct version of the same code:
-
-The length and capacity of a slice can be inspected using the built-in
-
-The next two sections discuss the relationship between length and capacity.
-
-The zero value of a slice is
-A slice can also be formed by "slicing" an existing slice or array. Slicing is
-done by specifying a half-open range with two indices separated by a colon. For
-example, the expression
-The start and end indices of a slice expression are optional; they default to zero and the slice's length respectively:
-
-This is also the syntax to create a slice given an array:
-
-Slice internals
-
-A slice is a descriptor of an array segment. It consists of a pointer to the
-array, the length of the segment, and its capacity (the maximum length of the
-segment).
-
-
-Our variable
-
-The length is the number of elements referred to by the slice. The capacity is
-the number of elements in the underlying array (beginning at the element
-referred to by the slice pointer). The distinction between length and capacity
-will be made clear as we walk through the next few examples.
-
-As we slice
-
-Slicing does not copy the slice's data. It creates a new slice value that
-points to the original array. This makes slice operations as efficient as
-manipulating array indices. Therefore, modifying the elements (not the
-slice itself) of a re-slice modifies the elements of the original slice:
-
-Earlier we sliced
-
-A slice cannot be grown beyond its capacity. Attempting to do so will cause a
-runtime panic, just as when indexing outside the bounds of a slice or array.
-Similarly, slices cannot be re-sliced below zero to access earlier elements in
-the array.
-
-Growing slices (the copy and append functions)
-
-To increase the capacity of a slice one must create a new, larger slice and
-copy the contents of the original slice into it. This technique is how dynamic
-array implementations from other languages work behind the scenes. The next
-example doubles the capacity of
-The looping piece of this common operation is made easier by the built-in copy
-function. As the name suggests, copy copies data from a source slice to a
-destination slice. It returns the number of elements copied.
-
-The
-Using
-A common operation is to append data to the end of a slice. This function
-appends byte elements to a slice of bytes, growing the slice if necessary, and
-returns the updated slice value:
-
-One could use
-Functions like
-But most programs don't need complete control, so Go provides a built-in
-
-The
-To append one slice to another, use
-Since the zero value of a slice (
-A possible "gotcha"
-
-As mentioned earlier, re-slicing a slice doesn't make a copy of the underlying
-array. The full array will be kept in memory until it is no longer referenced.
-Occasionally this can cause the program to hold all the data in memory when
-only a small piece of it is needed.
-
-For example, this
-This code behaves as advertised, but the returned
-To fix this problem one can copy the interesting data to a new slice before
-returning it:
-
-A more concise version of this function could be constructed by using
-
-Further Reading
-
-Effective Go contains an
-in-depth treatment of slices
-and arrays,
-and the Go language specification
-defines slices and their
-associated
-helper
-functions.
-Random and Seed - that wrap C's rand
-and srand functions.
-rand package imports "C", but you'll find there's
-no such package in the standard Go library. That's because C is a
-"pseudo-package", a special name interpreted by cgo as a reference to C's
-name space.
-rand package contains four references to the C
-package: the calls to C.rand and C.srand, the
-conversion C.uint(i), and the import statement.
-Random function calls the standard C library's random
-function and returns the result. In C, rand returns a value of the
-C type int, which cgo represents as the type C.int.
-It must be converted to a Go type before it can be used by Go code outside this
-package, using an ordinary Go type conversion:
-Seed function does the reverse, in a way. It takes a
-regular Go int, converts it to the C unsigned int
-type, and passes it to the C function srand.
-unsigned int type as C.uint;
-see the cgo documentation for a complete list of
-these numeric type names.
-import statement.
-#cgo
-followed
-by a space character are removed; these become directives for cgo.
-The remaining lines are used as a header when compiling the C parts of
-the package. In this case those lines are just a
-single #include
-statement, but they can be almost any C code. The #cgo
-directives are
-used to provide flags for the compiler and linker when building the C
-parts of the package.
-//export
-directives, then the C code in the comment may only include declarations
-(extern int f();), not definitions (int f() {
-return 1; }). You can use //export directives to
-make Go functions accessible to C code.
-#cgo and //export directives are
-documented in
-the cgo documentation.
-C.CString, C.GoString, and
-C.GoStringN functions. These conversions make a copy of the
-string data.
-Print function that writes a
-string to standard output using C's fputs function from the
-stdio library:
-C.CString (or any C memory
-allocation) you must remember to free the memory when you're done with it
-by calling C.free.
-C.CString returns a pointer to the start of the
-char array, so before the function exits we convert it to an
-unsafe.Pointer and release
-the memory allocation with C.free. A common idiom in cgo programs
-is to defer
-the free immediately after allocating (especially when the code that follows
-is more complex than a single function call), as in this rewrite of
-Print:
-go build" or
-"go install
-" as usual. The go tool recognizes the special "C" import and automatically
-uses cgo for those files.
-ch, but want to wait at most one
-second for the value to arrive. We would start by creating a signalling channel
-and launching a goroutine that sleeps before sending on the channel:
-select statement to receive from either
-ch or timeout. If nothing arrives on ch
-after one second, the timeout case is selected and the attempt to read from
-ch is abandoned.
-timeout channel is buffered with space for 1 value, allowing
-the timeout goroutine to send to the channel and then exit. The goroutine
-doesn't know (or care) whether the value is received. This means the goroutine
-won't hang around forever if the ch receive happens before the
-timeout is reached. The timeout channel will eventually be
-deallocated by the garbage collector.
-time.Sleep to demonstrate the mechanics
-of goroutines and channels. In real programs you should use
-time.After, a function that returns
-a channel and sends on that channel after the specified duration.)
-Query takes a slice of database connections and a
-query string. It queries each of the databases in parallel and
-returns the first response it receives:
-select statement with a
-default case. If the send cannot go through immediately the
-default case will be selected. Making the send non-blocking guarantees that
-none of the goroutines launched in the loop will hang around. However, if the
-result arrives before the main function has made it to the receive, the send
-could fail since no one is ready.
-ch (by
-adding the buffer length as the second argument to make),
-guaranteeing that the first send has a place to put the value. This ensures the
-send will always succeed, and the first value to arrive will be retrieved
-regardless of the order of execution.
-Calling g.
-Printing in g 0
-Printing in g 1
-Printing in g 2
-Printing in g 3
-Panicking!
-Defer in g 3
-Defer in g 2
-Defer in g 1
-Defer in g 0
-Recovered in f 4
-Returned normally from f.
-
-Calling g.
-Printing in g 0
-Printing in g 1
-Printing in g 2
-Printing in g 3
-Panicking!
-Defer in g 3
-Defer in g 2
-Defer in g 1
-Defer in g 0
-panic: 4
-
-panic PC=0x2a9cd8
-[stack trace omitted]
-
-mu.Lock()
-defer mu.Unlock()
-
-printHeader()
-defer printFooter()
-
-error type. Go code uses error values to
-indicate an abnormal state. For example, the os.Open function
-returns a non-nil error value when it fails to open a file.
-os.Open to open a file. If an error
-occurs it calls log.Fatal to print the error message and stop.
-error
-type, but in this article we'll take a closer look at error and
-discuss some good practices for error handling in Go.
-error type is an interface type. An error
-variable represents any value that can describe itself as a string. Here is the
-interface's declaration:
-type error interface {
- Error() string
-}
-
-error type, as with all built in types, is
-predeclared in the
-universe block.
-error implementation is the
-errors package's unexported errorString type.
-errors.New
-function. It takes a string that it converts to an errors.errorString
-and returns as an error value.
-errors.New:
-Sqrt receives a non-nil
-error value (whose concrete representation is an
-errors.errorString value). The caller can access the error string
-("math: square root of...") by calling the error's
-Error method, or by just printing it:
-error value
-by calling its Error() string method.
-os.Open formats as "open /etc/passwd:
-permission denied," not just "permission denied." The error returned by our
-Sqrt is missing information about the invalid argument.
-fmt package's
-Errorf. It formats a string according to Printf's
-rules and returns it as an error created by
-errors.New.
-fmt.Errorf is good enough, but since
-error is an interface, you can use arbitrary data structures as
-error values, to allow callers to inspect the details of the error.
-Sqrt. We can enable that by defining a new
-error implementation instead of using errors.errorString:
-NegativeSqrtError and handle it specially, while callers that just
-pass the error to fmt.Println or log.Fatal will see
-no change in behavior.
-SyntaxError type that the json.Decode function
-returns when it encounters a syntax error parsing a JSON blob.
-Offset field isn't even shown in the default formatting of the
-error, but callers can use it to add file and line information to their error
-messages:
-error interface requires only a Error method;
-specific error implementations might have additional methods. For instance, the
-net package returns errors of type
-error, following the usual convention, but some of the error
-implementations have additional methods defined by the net.Error
-interface:
-package net
-
-type Error interface {
- error
- Timeout() bool // Is the error a timeout?
- Temporary() bool // Is the error temporary?
-}
-
-net.Error with a type assertion and
-then distinguish transient network errors from permanent ones. For instance, a
-web crawler might sleep and retry when it encounters a temporary error and give
-up otherwise.
-datastore.Get
-function and viewTemplate's Execute method. In both
-cases, it presents a simple error message to the user with the HTTP status code
-500 ("Internal Server Error"). This looks like a manageable amount of code, but
-add some more HTTP handlers and you quickly end up with many copies of
-identical error handling code.
-appHandler
-type that includes an error return value:
-viewRecord function to return errors:
-error.
-To fix this we can implement the http.Handler interface's
-ServeHTTP method on appHandler:
-ServeHTTP method calls the appHandler function
-and displays the returned error (if any) to the user. Notice that the method's
-receiver, fn, is a function. (Go can do that!) The method invokes
-the function by calling the receiver in the expression fn(w, r).
-viewRecord with the http package we use the
-Handle function (instead of HandleFunc) as
-appHandler is an http.Handler (not an
-http.HandlerFunc).
-appError struct containing an
-error and some other fields:
-*appError values:
-error,
-for reasons discussed in the Go FAQ,
-but it's the right thing to do here because ServeHTTP is the only
-place that sees the value and uses its contents.)
-appHandler's ServeHTTP method display the
-appError's Message to the user with the correct HTTP
-status Code and log the full Error to the developer
-console:
-viewRecord to the new function signature and
-have it return more context when it encounters an error:
-viewRecord is the same length as the original, but
-now each of those lines has specific meaning and we are providing a friendlier
-user experience.
-
-
-
-appError that stores the
-stack trace for easier debugging,
-appHandler, logging the error
-to the console as "Critical," while telling the user "a serious error
-has occurred." This is a nice touch to avoid exposing the user to inscrutable
-error messages caused by programming errors.
-See the Defer, Panic, and Recover
-article for more details.
-T.x and
-T.y are required to be present whenever a value of type
-T is encoded or decoded. Although such required fields may seem
-like a good idea, they are costly to implement because the codec must maintain a
-separate data structure while encoding and decoding, to be able to report when
-required fields are missing. They're also a maintenance problem. Over time, one
-may want to modify the data definition to remove a required field, but that may
-cause existing clients of the data to crash. It's better not to have them in the
-encoding at all. (Protocol buffers also have optional fields. But if we don't
-have required fields, all fields are optional and that's that. There will be
-more to say about optional fields a little later.)
-int8s and uint16s.
-Instead, somewhat analogous to constants in Go, its integer values are abstract,
-sizeless numbers, either signed or unsigned. When you encode an
-int8, its value is transmitted as an unsized, variable-length
-integer. When you encode an int64, its value is also transmitted as
-an unsized, variable-length integer. (Signed and unsigned are treated
-distinctly, but the same unsized-ness applies to unsigned values too.) If both
-have the value 7, the bits sent on the wire will be identical. When the receiver
-decodes that value, it puts it into the receiver's variable, which may be of
-arbitrary integer type. Thus an encoder may send a 7 that came from an
-int8, but the receiver may store it in an int64. This
-is fine: the value is an integer and as a long as it fits, everything works. (If
-it doesn't fit, an error results.) This decoupling from the size of the variable
-gives some flexibility to the encoding: we can expand the type of the integer
-variable as the software evolves, but still be able to decode old data.
-int8, *int8,
-**int8, ****int8, etc. are all transmitted as an
-integer value, which may then be stored in int of any size, or
-*int, or ******int, etc. Again, this allows for
-flexibility.
-t sends only the 7 and 8. Because it's zero, the
-value of Y isn't even sent; there's no need to send a zero value.
-u with only X set (to the
-address of an int8 variable set to 7); the Z field is
-ignored - where would you put it? When decoding structs, fields are matched by
-name and compatible type, and only fields that exist in both are affected. This
-simple approach finesses the "optional field" problem: as the type
-T evolves by adding fields, out of date receivers will still
-function with the part of the type they recognize. Thus gobs provide the
-important result of optional fields - extensibility - without any additional
-mechanism or notation.
-T, the gob encoder sends a
-description of T and tags it with a type number, say 127. All
-values, including the first, are then prefixed by that number, so a stream of
-T values looks like:
-
-("define type id" 127, definition of type T)(127, T value)(127, T value), ...
-
-
-fmt package's Fprint
-function:
-sort
-package's brief description:
-gob
-package's overview. That package uses another convention for packages
-that need large amounts of introductory documentation: the package comment is
-placed in its own file, doc.go, which
-contains only those comments and a package clause.
-"BUG(who)" are recognized as known bugs, and included in
-the "Bugs" section of the package documentation. The "who" part should be the
-user name of someone who could provide more information. For example, this is a
-known issue from the sync/atomic package:
-
-// BUG(rsc): On x86-32, the 64-bit functions use instructions
-// unavailable before the Pentium MMX. On both ARM and x86-32, it is the
-// caller's responsibility to arrange for 64-bit alignment of 64-bit
-// words accessed atomically.
-
-
-doc.go.
-For example, see the
-godoc documentation and its corresponding
-doc.go file.
-
-
-
-$GOROOT/src/pkg
-and any GOPATH work spaces will already be accessible via godoc's
-command-line and HTTP interfaces, and you can specify additional paths for
-indexing via the -path flag or just by running "godoc ."
-in the source directory. See the godoc documentation
-for more details.
-testing package's naming
-conventions and presents them appropriately.
-
-int x;
-
-
-
-int *p;
-int a[3];
-
-
-
-int main(argc, argv)
- int argc;
- char *argv[];
-{ /* ... */ }
-
-
-
-int main(int argc, char *argv[]) { /* ... */ }
-
-
-
-int (*fp)(int a, int b);
-
-
-
-int (*fp)(int (*ff)(int x, int y), int b)
-
-
-
-int main(int, char *[])
-
-
-
-char *argv[]
-
-
-
-int (*fp)(int (*)(int, int), int)
-
-
-
-int (*)(int, int)
-
-
-
-int (*(*fp)(int (*)(int, int), int))(int, int)
-
-
-
-(int)M_PI
-
-
-
-x: int
-p: pointer to int
-a: array[3] of int
-
-
-
-x int
-p *int
-a [3]int
-
-
-
-func main(argc int, argv *[]byte) int
-
-
-
-func main(int, *[]byte) int
-
-
-
-f func(func(int,int) int, int) int
-
-
-
-f func(func(int,int) int, int) func(int, int) int
-
-
-
-sum := func(a, b int) int { return a+b } (3, 4)
-
-
-
-var a []int
-x = a[1]
-
-
-
-var p *int
-x = *p
-
-
-
-var p *int
-x = p*
-
-
-
-var p ^int
-x = p^
-
-
-
-[]int("hi")
-
-
-
-(*int)(nil)
-
-
-dst = (src IN mask) OP dst.
-For a fully opaque mask, this reduces to the original Porter-Duff
-formula: dst = src OP dst. In Go, a nil mask image is equivalent
-to an infinitely sized, fully opaque mask image.
-Over and Src constants. The Over operator
-performs the natural layering of a source image over a destination
-image: the change to the destination image is smaller where the
-source (after masking) is more transparent (that is, has lower
-alpha). The Src operator merely copies the source (after masking)
-with no regard for the destination image's original content. For
-fully opaque source and mask images, the two operators produce the
-same output, but the Src operator is usually faster.
-sp and mp: the source rectangle is equal to r
-translated so that r.Min in the destination image aligns with
-sp in the source image, and similarly for mp. The effective
-rectangle is also clipped to each image's bounds in their
-respective co-ordinate space.
-
-DrawMask
-function takes seven arguments, but an explicit mask and mask-point
-are usually unnecessary, so the
-Draw function takes five:
-
-// Draw calls DrawMask with a nil mask.
-func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op)
-func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point,
- mask image.Image, mp image.Point, op Op)
-
-
-draw.Image
-interface which has a Set method.
-image.Uniform
-source. The Uniform type re-interprets a Color as a
-practically infinite-sized Image of that color. For those
-familiar with the design of Plan 9's draw library, there is no need
-for an explicit "repeat bit" in Go's slice-based image types; the
-concept is subsumed by Uniform.
-image.Transparent, which is an image.Uniform:
-
-sr in the source image to a rectangle
-starting at a point dp in the destination, convert the source
-rectangle into the destination image's co-ordinate space:
-sr = src.Bounds().
-
-
image.RGBA: decoding a GIF results in an image.Paletted,
-decoding a JPEG results in a ycbcr.YCbCr, and the result of
-decoding a PNG depends on the image data. To convert any image to
-an image.RGBA:
-
-p and radius
-r:
-
-p, draw with
-an image.Uniform source and an image.Alpha mask. For
-simplicity, we aren't performing any sub-pixel positioning or
-rendering, or correcting for a font's height above a baseline.
-
-DrawMask function takes arguments
-of interface types, but immediately makes type assertions that its
-arguments are of specific struct types, corresponding to common
-operations like drawing one image.RGBA image onto another, or
-drawing an image.Alpha mask (such as a font glyph) onto an
-image.RGBA image. If a type assertion succeeds, that type
-information is used to run a specialized implementation of the
-general algorithm. If the assertions fail, the fallback code path
-uses the generic At and Set methods. The fast-paths are purely
-a performance optimization; the resultant destination image is the
-same either way. In practice, only a small number of special cases
-are necessary to support typical applications.
-color.Color and color.Model describe colors,
-image.Point and image.Rectangle describe basic 2-D
-geometry, and image.Image brings the two concepts together to
-represent a rectangular grid of colors. A
-separate article covers image
-composition with the image/draw package.
-uint32, even though the maximum value is 65535, to
-guarantee that multiplying two values together won't overflow. Such
-multiplications occur when blending two colors according to an alpha mask from a
-third color, in the style of
-Porter and Duff's
-classic algebra:
-
-dstr, dstg, dstb, dsta := dst.RGBA()
-srcr, srcg, srcb, srca := src.RGBA()
-_, _, _, m := mask.RGBA()
-const M = 1<<16 - 1
-// The resultant red value is a blend of dstr and srcr, and ranges in [0, M].
-// The calculation for green, blue and alpha is similar.
-dstr = (dstr*(M-m) + srcr*m) / M
-
-
-Color uses
-alpha-premultiplied values.
-Color interface. For example,
-RGBA is a struct that represents
-the classic "8 bits per channel" color.
-R field of an RGBA is an 8-bit
-alpha-premultiplied color in the range [0, 255]. RGBA satisfies the
-Color interface by multiplying that value by 0x101 to generate a
-16-bit alpha-premultiplied color in the range [0, 65535]. Similarly, the
-NRGBA struct type represents
-an 8-bit non-alpha-premultiplied color, as used by the PNG image format. When
-manipulating an NRGBA's fields directly, the values are
-non-alpha-premultiplied, but when calling the RGBA method, the
-return values are alpha-premultiplied.
-Model is simply
-something that can convert Colors to other Colors, possibly lossily. For
-example, the GrayModel can convert any Color to a
-desaturated Gray. A
-Palette can convert any Color to one from a
-limited palette.
-Point is an (x, y) co-ordinate
-on the integer grid, with axes increasing right and down. It is neither a pixel
-nor a grid square. A Point has no intrinsic width, height or
-color, but the visualizations below use a small colored square.
-
-Rectangle is an axis-aligned
-rectangle on the integer grid, defined by its top-left and bottom-right
-Point. A Rectangle also has no intrinsic color, but
-the visualizations below outline rectangles with a thin colored line, and call
-out their Min and Max Points.
-image.Rect(x0, y0, x1, y1) is equivalent to
-image.Rectangle{image.Point{x0, y0}, image.Point{x1, y1}}, but is
-much easier to type.
-Rectangle is inclusive at the top-left and exclusive at the
-bottom-right. For a Point p and a Rectangle r,
-p.In(r) if and only if
-r.Min.X <= p.X && p.X < r.Max.X, and similarly for Y. This is analogous to how
-a slice s[i0:i1] is inclusive at the low end and exclusive at the
-high end. (Unlike arrays and slices, a Rectangle often has a
-non-zero origin.)
-
-Point to a Rectangle translates the
-Rectangle. Points and Rectangles are not restricted to be in the
-bottom-right quadrant.
-
-
-Rectangle argument will be as efficient as a function that takes
-two Point arguments, or four int arguments.
-Rectangle to a Color from a Model.
-"The pixel at (x, y)" refers to the color of the grid square defined by the
-points (x, y), (x+1, y), (x+1, y+1) and (x, y+1).
-Image's bounds start at (0,
-0). For example, an animated GIF contains a sequence of Images, and each
-Image after the first typically only holds pixel data for the area
-that changed, and that area doesn't necessarily start at (0, 0). The correct
-way to iterate over an Image m's pixels looks like:
-
-b := m.Bounds()
-for y := b.Min.Y; y < b.Max.Y; y++ {
- for x := b.Min.X; x < b.Max.X; x++ {
- doStuffWith(m.At(x, y))
- }
-}
-
-
-Image implementations do not have to be based on an in-memory
-slice of pixel data. For example, a
-Uniform is an
-Image of enormous bounds and uniform color, whose in-memory
-representation is simply that color.
-RGBA and
-Gray (which other packages refer
-to as image.RGBA and image.Gray) hold slices of pixel
-data and implement the Image interface.
-Set(x, y int, c color.Color) method
-that allows modifying the image one pixel at a time.
-Pix field directly.
-Image implementations also provide a
-SubImage method, which returns an Image backed by the
-same array. Modifying the pixels of a sub-image will affect the pixels of the
-original image, analogous to how modifying the contents of a sub-slice
-s[i0:i1] will affect the contents of the original slice
-s.
-
-
-{{code "/doc/progs/image_package6.go" `/m0 := image.New/` `/fmt.Println\(m0.Stride/`}}
-
-Pix field, be aware
-that ranging over Pix can affect pixels outside an image's bounds.
-In the example above, the pixels covered by m1.Pix are shaded in
-blue. Higher-level code, such as the At and Set
-methods or the image/draw package, will clip
-their operations to the image's bounds.
-io.Reader directly.
-
-import (
- "image/jpeg"
- "image/png"
- "io"
-)
-
-// convertJPEGToPNG converts from JPEG to PNG.
-func convertJPEGToPNG(w io.Writer, r io.Reader) error {
- img, err := jpeg.Decode(r)
- if err != nil {
- return err
- }
- return png.Encode(w, img)
-}
-
-
-image.Decode function can detect
-the format. The set of recognized formats is constructed at run time and is not
-limited to those in the standard package library. An image format package
-typically registers its format in an init function, and the main package will
-"underscore import" such a package solely for the side effect of format
-registration.
-
-import (
- "image"
- "image/png"
- "io"
-
- _ "code.google.com/p/vp8-go/webp"
- _ "image/jpeg"
-)
-
-// convertToPNG converts from any recognized format to PNG.
-func convertToPNG(w io.Writer, r io.Reader) error {
- img, _, err := image.Decode(r)
- if err != nil {
- return err
- }
- return png.Encode(w, img)
-}
-
diff --git a/doc/articles/index.html b/doc/articles/index.html
index 5f70734ecd..9ddd669731 100644
--- a/doc/articles/index.html
+++ b/doc/articles/index.html
@@ -3,5 +3,6 @@
}-->
Marshal function.
-
-func Marshal(v interface{}) ([]byte, error)
-
-
-Message,
-Message
-m using json.Marshal:
-err will be nil and b
-will be a []byte containing this JSON data:
-
-b == []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)
-
-
-
-
-
-map[string]T (where T is any Go type
-supported by the json package).
-Marshal
-to go into an infinite loop.
-nil).
-Unmarshal function.
-
-func Unmarshal(data []byte, v interface{}) error
-
-
-json.Unmarshal, passing it a []byte of JSON
-data and a pointer to m
-b contains valid JSON that fits in m, after the
-call err will be nil and the data from b
-will have been stored in the struct m, as if by an assignment
-like:
-Unmarshal identify the fields in which to store the
-decoded data? For a given JSON key "Foo", Unmarshal
-will look through the destination struct's fields to find (in order of
-preference):
-
-
-
-`json:"Foo"` (see the
-Go spec for more on struct tags),
-"Foo", or
-"FOO" or "FoO" or some other
-case-insensitive match of "Foo".
-Unmarshal will decode only the fields that it can find in the
-destination type. In this case, only the Name field of m will be
-populated, and the Food field will be ignored. This behavior is
-particularly useful when you wish to pick only a few specific fields out of a
-large JSON blob. It also means that any unexported fields in the destination
-struct will be unaffected by Unmarshal.
-interface{}
-interface{} (empty interface) type describes an interface with
-zero methods. Every Go type implements at least zero methods and therefore
-satisfies the empty interface.
-map[string]interface{} and
-[]interface{} values to store arbitrary JSON objects and arrays;
-it will happily unmarshal any valid JSON blob into a plain
-interface{} value. The default concrete Go types are:
-
-
-
-bool for JSON booleans,
-float64 for JSON numbers,
-string for JSON strings, and
-nil for JSON null.
-b:
-interface{} value with Unmarshal:
-f would be a map whose keys are
-strings and whose values are themselves stored as empty interface values:
-f's
-underlying map[string]interface{}:
-FamilyMember value works as
-expected, but if we look closely we can see a remarkable thing has happened.
-With the var statement we allocated a FamilyMember struct, and
-then provided a pointer to that value to Unmarshal, but at that
-time the Parents field was a nil slice value. To
-populate the Parents field, Unmarshal allocated a new
-slice behind the scenes. This is typical of how Unmarshal works
-with the supported reference types (pointers, slices, and maps).
-
-type Foo struct {
- Bar *Bar
-}
-
-
-Bar field in the JSON object,
-Unmarshal would allocate a new Bar and populate it.
-If not, Bar would be left as a nil pointer.
-
-type IncomingMessage struct {
- Cmd *Command
- Msg *Message
-}
-
-
-Cmd field and/or the
-Msg field of the top-level JSON object, depending on the type of
-message they want to communicate. Unmarshal, when decoding the
-JSON into an IncomingMessage struct, will only allocate the data
-structures present in the JSON data. To know which messages to process, the
-programmer need simply test that either Cmd or Msg is
-not nil.
-Decoder and Encoder types
-to support the common operation of reading and writing streams of JSON data.
-The NewDecoder and NewEncoder functions wrap the
-io.Reader and
-io.Writer interface types.
-
-func NewDecoder(r io.Reader) *Decoder
-func NewEncoder(w io.Writer) *Encoder
-
-
-Name field from each object, and then
-writes the objects to standard output:
-Encoder and
-Decoder types can be used in a broad range of scenarios, such as
-reading and writing to HTTP connections, WebSockets, or files.
-
-type ServerCodec interface {
- ReadRequestHeader(*Request) error
- ReadRequestBody(interface{}) error
- WriteResponse(*Response, interface{}) error
- Close() error
-}
-
-
-ServerCodec interface instead of our existing
-gob.Encoder. Here's one of them:
-
-func sendResponse(sending *sync.Mutex, req *Request,
- reply interface{}, enc *gob.Encoder, errmsg string)
-
-
-
-func sendResponse(sending *sync.Mutex, req *Request,
- reply interface{}, enc ServerCodec, errmsg string)
-
-
-gobServerCodec wrapper to reproduce the
-original functionality. From there it is simple to build a
-jsonServerCodec.
-int,
-float32, *MyType, []byte,
-and so on. If we declare
-i has type int and j
-has type MyInt. The variables i and
-j have distinct static types and, although they have
-the same underlying type, they cannot be assigned to one another
-without a conversion.
-io.Reader and io.Writer, the types
-Reader and Writer from the
-io package:
-Read (or
-Write) method with this signature is said to implement
-io.Reader (or io.Writer). For the
-purposes of this discussion, that means that a variable of type
-io.Reader can hold any value whose type has a
-Read method:
-r may hold, r's type is always
-io.Reader: Go is statically typed and the static type
-of r is io.Reader.
-interface{}
-
-
-r contains, schematically, the (value, type) pair,
-(tty, *os.File). Notice that the type
-*os.File implements methods other than
-Read; even though the interface value provides access
-only to the Read method, the value inside carries all
-the type information about that value. That's why we can do things
-like this:
-r also implements
-io.Writer, and so we can assign it to w.
-After the assignment, w will contain the pair
-(tty, *os.File). That's the same pair as
-was held in r. The static type of the interface
-determines what methods may be invoked with an interface variable,
-even though the concrete value inside may have a larger set of
-methods.
-empty, will again contain
-that same pair, (tty, *os.File). That's
-handy: an empty interface can hold any value and contains all the
-information we could ever need about that value.
-w satisfies the empty interface. In the example
-where we moved a value from a Reader to a
-Writer, we needed to be explicit and use a type
-assertion because Writer's methods are not a
-subset of Reader's.)
-reflect.TypeOf and
-reflect.ValueOf, retrieve reflect.Type
-and reflect.Value pieces out of an interface value.
-(Also, from the reflect.Value it's easy to get
-to the reflect.Type, but let's keep the
-Value and Type concepts separate for
-now.)
-TypeOf:
-
-type: float64
-
-
-float64 variable x, not an
-interface value, to reflect.TypeOf. But it's there; as
-godoc reports, the signature of
-reflect.TypeOf includes an empty interface:
-
-// TypeOf returns the reflection Type of the value in the interface{}.
-func TypeOf(i interface{}) Type
-
-
-reflect.TypeOf(x), x is
-first stored in an empty interface, which is then passed as the
-argument; reflect.TypeOf unpacks that empty interface
-to recover the type information.
-reflect.ValueOf function, of course, recovers the
-value (from here on we'll elide the boilerplate and focus just on
-the executable code):
-
-value: <float64 Value>
-
-
-reflect.Type and reflect.Value have
-lots of methods to let us examine and manipulate them. One
-important example is that Value has a
-Type method that returns the Type of a
-reflect.Value. Another is that both Type
-and Value have a Kind method that returns
-a constant indicating what sort of item is stored:
-Uint, Float64, Slice, and so
-on. Also methods on Value with names like
-Int and Float let us grab values (as
-int64 and float64) stored inside:
-
-type: float64
-kind is float64: true
-value: 3.4
-
-
-SetInt and
-SetFloat but to use them we need to understand
-settability, the subject of the third law of reflection, discussed
-below.
-Value operate on the largest type that can
-hold the value: int64 for all the signed integers, for
-instance. That is, the Int method of
-Value returns an int64 and the
-SetInt value takes an int64; it may be
-necessary to convert to the actual type involved:
-Kind of a reflection
-object describes the underlying type, not the static type. If a
-reflection object contains a value of a user-defined integer type,
-as in
-Kind of v is still
-reflect.Int, even though the static type of
-x is MyInt, not int. In
-other words, the Kind cannot discriminate an int from
-a MyInt even though the Type can.
-reflect.Value we can recover an interface
-value using the Interface method; in effect the method
-packs the type and value information back into an interface
-representation and returns the result:
-
-// Interface returns v's value as an interface{}.
-func (v Value) Interface() interface{}
-
-
-float64 value represented by the
-reflection object v.
-fmt.Println, fmt.Printf and so on are all
-passed as empty interface values, which are then unpacked by the
-fmt package internally just as we have been doing in
-the previous examples. Therefore all it takes to print the contents
-of a reflect.Value correctly is to pass the result of
-the Interface method to the formatted print
-routine:
-fmt.Println(v)? Because v is a
-reflect.Value; we want the concrete value it holds.)
-Since our value is a float64, we can even use a
-floating-point format if we want:
-
-3.4e+00
-
-
-v.Interface() to float64; the empty
-interface value has the concrete value's type information inside
-and Printf will recover it.
-Interface method is the inverse of the
-ValueOf function, except that its result is always of
-static type interface{}.
-
-panic: reflect.Value.SetFloat using unaddressable value
-
-
-7.1 is not
-addressable; it's that v is not settable. Settability
-is a property of a reflection Value, and not all
-reflection Values have it.
-CanSet method of Value reports the
-settability of a Value; in our case,
-
-settability of v: false
-
-
-Set method on an non-settable
-Value. But what is settability?
-x to
-reflect.ValueOf, so the interface value created as the
-argument to reflect.ValueOf is a copy of
-x, not x itself. Thus, if the
-statement
-x, even
-though v looks like it was created from
-x. Instead, it would update the copy of x
-stored inside the reflection value and x itself would
-be unaffected. That would be confusing and useless, so it is
-illegal, and settability is the property used to avoid this
-issue.
-x to a
-function:
-
-f(x)
-
-
-f to be able to modify
-x because we passed a copy of x's value,
-not x itself. If we want f to modify
-x directly we must pass our function the address of
-x (that is, a pointer to x):f(&x)
-x by reflection, we must
-give the reflection library a pointer to the value we want to
-modify.
-x as usual
-and then create a reflection value that points to it, called
-p.
-
-type of p: *float64
-settability of p: false
-
-
-p isn't settable, but it's not
-p we want to set, it's (in effect) *p. To
-get to what p points to, we call the Elem
-method of Value, which indirects through the pointer,
-and save the result in a reflection Value called
-v:
-v is a settable reflection object, as the output
-demonstrates,
-
-settability of v: true
-
-
-x, we are finally able to use
-v.SetFloat to modify the value of
-x:
-
-7.1
-7.1
-
-
-Types and
-Values that can disguise what's going on. Just keep in
-mind that reflection Values need the address of something in order
-to modify what they represent.
-v wasn't a pointer itself, it
-was just derived from one. A common way for this situation to arise
-is when using reflection to modify the fields of a structure. As
-long as we have the address of the structure, we can modify its
-fields.
-t. We create
-the reflection object with the address of the struct because we'll want to
-modify it later. Then we set typeOfT to its type and iterate over
-the fields using straightforward method calls
-(see package reflect for details).
-Note that we extract the names of the fields from the struct type, but the
-fields themselves are regular reflect.Value objects.
-
-0: A int = 23
-1: B string = skidoo
-
-
-T are upper case
-(exported) because only exported fields of a struct are
-settable.
-s contains a settable reflection object, we
-can modify the fields of the structure.
-
-t is now {77 Sunset Strip}
-
-
-s was created from
-t, not &t, the calls to
-SetInt and SetString would fail as the
-fields of t would not be settable.
-
-
-
-Introduction
-
-
-func main() {
- c := make(chan bool)
- m := make(map[string]string)
- go func() {
- m["1"] = "a" // First conflicting access.
- c <- true
- }()
- m["2"] = "b" // Second conflicting access.
- <-c
- for k, v := range m {
- fmt.Println(k, v)
- }
-}
-
-
-Usage
-
--race flag to the go command:
-
-$ go test -race mypkg // to test the package
-$ go run -race mysrc.go // to run the source file
-$ go build -race mycmd // to build the command
-$ go install -race mypkg // to install the package
-
-
-Report Format
-
-
-WARNING: DATA RACE
-Read by goroutine 185:
- net.(*pollServer).AddFD()
- src/pkg/net/fd_unix.go:89 +0x398
- net.(*pollServer).WaitWrite()
- src/pkg/net/fd_unix.go:247 +0x45
- net.(*netFD).Write()
- src/pkg/net/fd_unix.go:540 +0x4d4
- net.(*conn).Write()
- src/pkg/net/net.go:129 +0x101
- net.func·060()
- src/pkg/net/timeout_test.go:603 +0xaf
-
-Previous write by goroutine 184:
- net.setWriteDeadline()
- src/pkg/net/sockopt_posix.go:135 +0xdf
- net.setDeadline()
- src/pkg/net/sockopt_posix.go:144 +0x9c
- net.(*conn).SetDeadline()
- src/pkg/net/net.go:161 +0xe3
- net.func·061()
- src/pkg/net/timeout_test.go:616 +0x3ed
-
-Goroutine 185 (running) created at:
- net.func·061()
- src/pkg/net/timeout_test.go:609 +0x288
-
-Goroutine 184 (running) created at:
- net.TestProlongTimeout()
- src/pkg/net/timeout_test.go:618 +0x298
- testing.tRunner()
- src/pkg/testing/testing.go:301 +0xe8
-
-
-Options
-
-GORACE environment variable sets race detector options.
-The format is:
-
-GORACE="option1=val1 option2=val2"
-
-
-
-
-
-log_path (default stderr): The race detector writes
-its report to a file named log_path.pid.
-The special names stdout
-and stderr cause reports to be written to standard output and
-standard error, respectively.
-exitcode (default 66): The exit status to use when
-exiting after a detected race.
-strip_path_prefix (default ""): Strip this prefix
-from all reported file paths, to make reports more concise.
-history_size (default 1): The per-goroutine memory
-access history is 32K * 2**history_size elements.
-Increasing this value can avoid a "failed to restore the stack" error in reports, at the
-cost of increased memory usage.
-halt_on_error (default 0): Controls whether the program
-exits after reporting first data race.
-
-$ GORACE="log_path=/tmp/race/report strip_path_prefix=/my/go/sources/" go test -race
-
-
-Excluding Tests
-
--race flag, the go command defines additional
-build tag race.
-You can use the tag to exclude some code and tests when running the race detector.
-Some examples:
-
-// +build !race
-
-package foo
-
-// The test contains a data race. See issue 123.
-func TestFoo(t *testing.T) {
- // ...
-}
-
-// The test fails under the race detector due to timeouts.
-func TestBar(t *testing.T) {
- // ...
-}
-
-// The test takes too long under the race detector.
-func TestBaz(t *testing.T) {
- // ...
-}
-
-
-How To Use
-
-go test -race).
-The race detector only finds races that happen at runtime, so it can't find
-races in code paths that are not executed.
-If your tests have incomplete coverage,
-you may find more races by running a binary built with -race under a realistic
-workload.
-Typical Data Races
-
-Race on loop counter
-
-
-func main() {
- var wg sync.WaitGroup
- wg.Add(5)
- for i := 0; i < 5; i++ {
- go func() {
- fmt.Println(i) // Not the 'i' you are looking for.
- wg.Done()
- }()
- }
- wg.Wait()
-}
-
-
-i in the function literal is the same variable used by the loop, so
-the read in the goroutine races with the loop increment.
-(This program typically prints 55555, not 01234.)
-The program can be fixed by making a copy of the variable:
-
-func main() {
- var wg sync.WaitGroup
- wg.Add(5)
- for i := 0; i < 5; i++ {
- go func(j int) {
- fmt.Println(j) // Good. Read local copy of the loop counter.
- wg.Done()
- }(i)
- }
- wg.Wait()
-}
-
-
-Accidentally shared variable
-
-
-// ParallelWrite writes data to file1 and file2, returns the errors.
-func ParallelWrite(data []byte) chan error {
- res := make(chan error, 2)
- f1, err := os.Create("file1")
- if err != nil {
- res <- err
- } else {
- go func() {
- // This err is shared with the main goroutine,
- // so the write races with the write below.
- _, err = f1.Write(data)
- res <- err
- f1.Close()
- }()
- }
- f2, err := os.Create("file2") // The second conflicting write to err.
- if err != nil {
- res <- err
- } else {
- go func() {
- _, err = f2.Write(data)
- res <- err
- f2.Close()
- }()
- }
- return res
-}
-
-
-:=):
-
- ...
- _, err := f1.Write(data)
- ...
- _, err := f2.Write(data)
- ...
-
-
-Unprotected global variable
-
-service map.
-Concurrent reads and writes of the same map are not safe:
-
-var service map[string]net.Addr
-
-func RegisterService(name string, addr net.Addr) {
- service[name] = addr
-}
-
-func LookupService(name string) net.Addr {
- return service[name]
-}
-
-
-
-var (
- service map[string]net.Addr
- serviceMu sync.Mutex
-)
-
-func RegisterService(name string, addr net.Addr) {
- serviceMu.Lock()
- defer serviceMu.Unlock()
- service[name] = addr
-}
-
-func LookupService(name string) net.Addr {
- serviceMu.Lock()
- defer serviceMu.Unlock()
- return service[name]
-}
-
-
-Primitive unprotected variable
-
-bool, int, int64, etc.),
-as in this example:
-
-type Watchdog struct{ last int64 }
-
-func (w *Watchdog) KeepAlive() {
- w.last = time.Now().UnixNano() // First conflicting access.
-}
-
-func (w *Watchdog) Start() {
- go func() {
- for {
- time.Sleep(time.Second)
- // Second conflicting access.
- if w.last < time.Now().Add(-10*time.Second).UnixNano() {
- fmt.Println("No keepalives for 10 seconds. Dying.")
- os.Exit(1)
- }
- }
- }()
-}
-
-
-sync/atomic package.
-
-type Watchdog struct{ last int64 }
-
-func (w *Watchdog) KeepAlive() {
- atomic.StoreInt64(&w.last, time.Now().UnixNano())
-}
-
-func (w *Watchdog) Start() {
- go func() {
- for {
- time.Sleep(time.Second)
- if atomic.LoadInt64(&w.last) < time.Now().Add(-10*time.Second).UnixNano() {
- fmt.Println("No keepalives for 10 seconds. Dying.")
- os.Exit(1)
- }
- }
- }()
-}
-
-
-Supported Systems
-
-darwin/amd64, linux/amd64, and windows/amd64.
-Runtime Overhead
-
-[4]int represents an array of four integers. An array's
-size is fixed; its length is part of its type ([4]int and
-[5]int are distinct, incompatible types). Arrays can be indexed in
-the usual way, so the expression s[n] accesses the nth
-element, starting from zero.
-
-var a [4]int
-a[0] = 1
-i := a[0]
-// i == 1
-
-
-
-// a[2] == 0, the zero value of the int type
-
-
-[4]int is just four integer values laid out sequentially:
-
-
-b := [2]string{"Penn", "Teller"}
-
-
-
-b := [...]string{"Penn", "Teller"}
-
-
-b is [2]string.
-[]T, where T is
-the type of the elements of the slice. Unlike an array type, a slice type has
-no specified length.
-
-letters := []string{"a", "b", "c", "d"}
-
-
-make,
-which has the signature,
-
-func make([]T, len, cap) []T
-
-
-make function takes a type, a length, and an optional capacity.
-When called, make allocates an array and returns a slice that
-refers to that array.
-
-var s []byte
-s = make([]byte, 5, 5)
-// s == []byte{0, 0, 0, 0, 0}
-
-
-
-s := make([]byte, 5)
-
-
-len and cap functions.
-
-len(s) == 5
-cap(s) == 5
-
-
-nil. The len and
-cap functions will both return 0 for a nil slice.
-b[1:4] creates a slice including elements
-1 through 3 of b (the indices of the resulting slice will be 0
-through 2).
-
-b := []byte{'g', 'o', 'l', 'a', 'n', 'g'}
-// b[1:4] == []byte{'o', 'l', 'a'}, sharing the same storage as b
-
-
-
-// b[:2] == []byte{'g', 'o'}
-// b[2:] == []byte{'l', 'a', 'n', 'g'}
-// b[:] == b
-
-
-
-x := [3]string{"Ðайка", "Ðелка", "СÑÑелка"}
-s := x[:] // a slice referencing the storage of x
-
-
-
-s, created earlier by make([]byte, 5),
-is structured like this:
-
-s, observe the changes in the slice data structure and
-their relation to the underlying array:
-
-s = s[2:4]
-
-
-
-
-d := []byte{'r', 'o', 'a', 'd'}
-e := d[2:]
-// e == []byte{'a', 'd'}
-e[1] = 'm'
-// e == []byte{'a', 'm'}
-// d == []byte{'r', 'o', 'a', 'm'}
-
-
-s to a length shorter than its capacity. We can
-grow s to its capacity by slicing it again:
-
-s = s[:cap(s)]
-
-
-
-s by making a new slice,
-t, copying the contents of s into t, and
-then assigning the slice value t to s:
-
-t := make([]byte, len(s), (cap(s)+1)*2) // +1 in case cap(s) == 0
-for i := range s {
- t[i] = s[i]
-}
-s = t
-
-
-
-func copy(dst, src []T) int
-
-
-copy function supports copying between slices of different
-lengths (it will copy only up to the smaller number of elements). In addition,
-copy can handle source and destination slices that share the same
-underlying array, handling overlapping slices correctly.
-copy, we can simplify the code snippet above:
-
-t := make([]byte, len(s), (cap(s)+1)*2)
-copy(t, s)
-s = t
-
-
-AppendByte like this:
-
-p := []byte{2, 3, 5}
-p = AppendByte(p, 7, 11, 13)
-// p == []byte{2, 3, 5, 7, 11, 13}
-
-
-AppendByte are useful because they offer complete
-control over the way the slice is grown. Depending on the characteristics of
-the program, it may be desirable to allocate in smaller or larger chunks, or to
-put a ceiling on the size of a reallocation.
-append function that's good for most purposes; it has the
-signature
-
-func append(s []T, x ...T) []T
-
-
-append function appends the elements x to the end
-of the slice s, and grows the slice if a greater capacity is
-needed.
-
-a := make([]int, 1)
-// a == []int{0}
-a = append(a, 1, 2, 3)
-// a == []int{0, 1, 2, 3}
-
-
-... to expand the second
-argument to a list of arguments.
-
-a := []string{"John", "Paul"}
-b := []string{"George", "Ringo", "Pete"}
-a = append(a, b...) // equivalent to "append(a, b[0], b[1], b[2])"
-// a == []string{"John", "Paul", "George", "Ringo", "Pete"}
-
-
-nil) acts like a zero-length
-slice, you can declare a slice variable and then append to it in a loop:
-FindDigits function loads a file into memory and
-searches it for the first group of consecutive numeric digits, returning them
-as a new slice.
-[]byte points
-into an array containing the entire file. Since the slice references the
-original array, as long as the slice is kept around the garbage collector can't
-release the array; the few useful bytes of the file keep the entire contents in
-memory.
-append. This is left as an exercise for the reader.
-tool subcommand.
-Finally, two of the commands, fmt and doc, are also
-installed as regular binaries called gofmt and godoc
-because they are so often referenced.
+Finally the fmt and godoc commands are installed
+as regular binaries called gofmt and godoc because
+they are so often referenced.
@@ -62,17 +62,17 @@ details.
"go test -coverprofile".
Check out the Go source code.
+A summary of the changes between Go releases.
++A guide for updating your code to work with Go 1. +
+ ++A list of significant changes in Go 1.1, with instructions for updating your +code where necessary. +
+ ++A list of significant changes in Go 1.2, with instructions for updating your +code where necessary. +
+ ++What Go 1 defines and the backwards-compatibility guarantees one can expect as +Go 1 matures. +
+ + +Check out the Go source code.
+The golang-dev mailing list is for discussing and reviewing code for the Go project.
@@ -80,29 +107,3 @@ open issues that interest you. Those labeled HelpWanted are particularly in need of outside help. - - -The golang-nuts -mailing list is for general Go discussion.
- -A list of external Go projects including programs and libraries.
- -#go-nuts on irc.freenode.net is the official Go IRC channel.
- -The Google+ community for Go enthusiasts.
- -The Go project's Google+ page.
- -The Go project's official Twitter account.
- -The official blog of the Go project, featuring news and in-depth articles by -the Go team and guests.
diff --git a/doc/docs.html b/doc/docs.html index 32ce1d63bc..7aad8dadf4 100644 --- a/doc/docs.html +++ b/doc/docs.html @@ -58,49 +58,47 @@ A must read for any new Go programmer. It augments the tour and the language specification, both of which should be read first. -Language specification, memory model, and detailed documentation for the commands and packages.
- --How to develop and deploy a simple Go project with -Google App Engine. +Answers to common questions about Go.
-A wiki maintained by the Go community.
+ +-Answers to common questions about Go. +See the Learn page at the Wiki +for more Go learning resources.
-A wiki maintained by the Go community.
--A guide for updating your code to work with Go 1. +The documentation for the Go standard library.
--A list of significant changes in Go 1.1, with instructions for updating your -code where necessary. +The documentation for the Go tools.
--A list of significant changes in Go 1.2, with instructions for updating your -code where necessary. +The official Go Language specification.
--What Go 1 defines and the backwards-compatibility guarantees one can expect as -Go 1 matures. +A document that specifies the conditions under which reads of a variable in +one goroutine can be guaranteed to observe values produced by writes to the +same variable in a different goroutine.
-The official blog of the Go project, featuring news and in-depth articles by @@ -119,44 +117,46 @@ Guided tours of Go programs.
+See the Articles page at the +Wiki for more Go articles. +
+ +
--The talks marked with a red asterisk (*) were written -before Go 1 and contain some examples that are no longer correct, but they are -still of value. -
-Three things that make Go fast, fun, and productive: @@ -164,63 +164,31 @@ interfaces, reflection, and concurrency. Builds a toy web crawler to demonstrate these.
--Concurrency is the key to designing high performance network services. Go's concurrency primitives (goroutines and channels) provide a simple and efficient means of expressing concurrent execution. In this talk we see how tricky concurrency problems can be solved gracefully with simple Go code. -
- --A panel discussion with David Symonds, Robert Griesemer, Rob Pike, Ken Thompson, Andrew Gerrand, and Brad Fitzpatrick. +One of Go's key design goals is code adaptability; that it should be easy to take a simple design and build upon it in a clean and natural way. In this talk Andrew Gerrand describes a simple "chat roulette" server that matches pairs of incoming TCP connections, and then use Go's concurrency mechanisms, interfaces, and standard library to extend it with a web interface and other features. While the function of the program changes dramatically, Go's flexibility preserves the original design as it grows.
--A talk by Rob Pike and Andrew Gerrand presented at Google I/O 2011. -It walks through the construction and deployment of a simple web application -and unveils the Go runtime for App Engine. -See the presentation slides. +Concurrency is the key to designing high performance network services. Go's concurrency primitives (goroutines and channels) provide a simple and efficient means of expressing concurrent execution. In this talk we see how tricky concurrency problems can be solved gracefully with simple Go code.
--A presentation delivered by Rob Pike and Russ Cox at Google I/O 2010. It -illustrates how programming in Go differs from other languages through a set of -examples demonstrating features particular to Go. These include concurrency, -embedded types, methods on any type, and program construction using interfaces. +This talk expands on the Go Concurrency Patterns talk to dive deeper into Go's concurrency primitives.
-See the GoTalks -page at the Go Wiki for -more Go talks. +See the Go Talks site and wiki page for more Go talks.
+-See the NonEnglish page -at the Go Wiki for localized +See the NonEnglish page +at the Wiki for localized documentation.
- -
-
-The golang-nuts -mailing list is for general Go discussion.
- -A list of external Go projects including programs and libraries.
- -#go-nuts on irc.freenode.net is the official Go IRC channel.
- -The Go project's Google+ page.
- -The Go project's official Twitter account.
diff --git a/doc/go1.html b/doc/go1.html index 2687827c0e..3bbe5d3168 100644 --- a/doc/go1.html +++ b/doc/go1.html @@ -1,5 +1,6 @@ diff --git a/doc/go1compat.html b/doc/go1compat.html index 1dfd382c23..7ca3d355d6 100644 --- a/doc/go1compat.html +++ b/doc/go1compat.html @@ -1,5 +1,6 @@