Jump to content

Go (programming language): Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Interface system: don't need one example in the text then a different one in code. would still like a more realistic example in code (but still short and easy for non-Go folks to understand)
Interface system: a "realistic" example in that it's complete runnable code using a standard interface (with Playground link!), but it's long and does noting interesting, so still not sure it's right
Line 60: Line 60:
Besides calling methods via interfaces, Go allows converting interface values to other types with a run-time type check. The language constructs to do so are the ''type assertion'',<ref>[http://golang.org/ref/spec#Type_assertions Type Assertions - The Go Language Specification]</ref> which checks against a single potential type, and the ''type switch'',<ref>[http://golang.org/ref/spec#Type_switches Type switches - The Go Language Specification]</ref> which checks against multiple types.
Besides calling methods via interfaces, Go allows converting interface values to other types with a run-time type check. The language constructs to do so are the ''type assertion'',<ref>[http://golang.org/ref/spec#Type_assertions Type Assertions - The Go Language Specification]</ref> which checks against a single potential type, and the ''type switch'',<ref>[http://golang.org/ref/spec#Type_switches Type switches - The Go Language Specification]</ref> which checks against multiple types.


Go types don't declare which interfaces they implement: having the required methods ''is'' implementing the interface. In the following code, <code>Sequence</code> implements <code>Sizer</code> without having to declare that it does:
Go types don't declare which interfaces they implement: having the required methods ''is'' implementing the interface.

In the simple program below, <code>DevZero</code> is an <code>io.Reader</code> yielding an infinite stream of zeroes, like Unix <code>/dev/zero</code>. <code>main()</code> creates a <code>DevZero</code>, then passes it to the standard library's <code>[http://golang.org/pkg/io/#CopyN io.CopyN(io.Writer, io.Reader, int)]</code> to copy ten zero bytes to a buffer. Note that no declaration that <code>DevZero</code> is an <code>io.Reader</code> was necessary, or even possible in Go:


<syntaxhighlight lang="go">
<syntaxhighlight lang="go">
package main
// in the 'sequence' package
type Sequence []int


import (
func (s Sequence) Size() int {
"bytes"
return len(s)
"fmt"
}
"io"
)

type DevZero struct{}


func (z *DevZero) Read(p []byte) (n int, err error) {
// in another package
for i := range p {
type Sizer interface {
p[i] = 0
Size() int
}
return len(p), nil
}
}


func IsNonempty(o Sizer) bool {
func main() {
buffer := bytes.NewBuffer(nil)
return o.Size() > 0
devZero := new(DevZero)
// copy 10 bytes from devZero to buffer
io.CopyN(buffer, devZero, 10)
fmt.Println(buffer.Bytes())
}
}
</syntaxhighlight>
</syntaxhighlight>
([http://play.golang.org/p/KH3K-vPXOW You can run or edit this example online.])


<code>interface{}</code>, the ''empty interface'', is an important corner case because it can refer to an item of ''any'' concrete type. Code using the empty interface can't simply call methods (or built-in operators) on a referred-to object, but it can store the interface value, check if the object satisfies a more specific interface (or if it's of a specific type), or inspect it with Go's <code>reflect</code> package.<ref>[http://golang.org/pkg/reflect/#ValueOf reflect.ValueOf(i interface{})] converts an <code>interface{}</code> to a <code>reflect.Value</code> that can be further inspected</ref> Because <code>interface{}</code> can refer to any value, it's a limited way to escape the restrictions of static typing, like <code>void*</code> in C but with additional run-time type checks.
<code>interface{}</code>, the ''empty interface'', is an important corner case because it can refer to an item of ''any'' concrete type. Code using the empty interface can't simply call methods (or built-in operators) on a referred-to object, but it can store the interface value, check if the object satisfies a more specific interface (or if it's of a specific type), or inspect it with Go's <code>reflect</code> package.<ref>[http://golang.org/pkg/reflect/#ValueOf reflect.ValueOf(i interface{})] converts an <code>interface{}</code> to a <code>reflect.Value</code> that can be further inspected</ref> Because <code>interface{}</code> can refer to any value, it's a limited way to escape the restrictions of static typing, like <code>void*</code> in C but with additional run-time type checks.

Revision as of 00:50, 8 October 2013

Template:Distinguish2

Go
Paradigmcompiled, concurrent, imperative, structured
Designed byRobert Griesemer
Rob Pike
Ken Thompson
DeveloperGoogle Inc.
First appeared2009
Stable release
version 1.1.2[1] / 13 August 2013; 11 years ago (2013-08-13)
Typing disciplinestrong, static
OSLinux, Mac OS X, FreeBSD, NetBSD, OpenBSD, MS Windows, Plan 9[2]
LicenseBSD-style[3] + Patent grant[4]
Filename extensions.go
Websitegolang.org
Major implementations
gc (8g, 6g, 5g), gccgo
Influenced by
C, Limbo, Modula, Newsqueak, Oberon, Pascal,[5] Python

Go, sometimes referred to as golang, is an open source, compiled, garbage-collected, concurrent system programming language. It was first designed and developed at Google Inc.[6] beginning in September 2007 by Robert Griesemer, Rob Pike, and Ken Thompson.[5]

The language was officially announced in November 2009 and is now used in some of Google's production systems.[7] Go's "gc" compiler targets the Linux, Mac OS X, FreeBSD, OpenBSD, Plan 9, and Microsoft Windows operating systems and the i386, amd64, and ARM processor architectures.[8]

Description

Go is a statically-typed language with syntax loosely derived from that of C, adding automatic memory management, type and memory safety, some dynamic-typing capabilities, additional types such as variable-length arrays and key-value maps, and a large standard library. Compared to some popular languages meeting that general description, like Java and C#, Go is distinguished by:

The Go authors express an openness to generic programming, explicitly argue against assertions and pointer arithmetic, while defending the choice to omit type inheritance as giving a more useful language, encouraging heavy use of interfaces instead.[5]

Some concurrency-related structural conventions of Go (channels and alternative channel inputs) are derived from Tony Hoare's communicating sequential processes model. Unlike previous concurrent programming languages such as occam or Limbo, Go does not provide any built-in notion of safe or verifiable concurrency.[14]

Initially, the language did not include exception handling, but in March 2010 a mechanism known as panic/recover was implemented to handle exceptional errors while avoiding some of the problems the Go authors find with exceptions.[15][16]

Interface system

In place of virtual inheritance, Go uses interfaces. An interface declaration is a list of required methods: for example, the interface io.Reader just requires the method Read(p []byte) (n int, err error).[17] Code that uses an io.Reader could potentially read from an HTTP connection, a file, an in-memory buffer, or any other source.

Go's standard library defines interfaces for a number of concepts: input sources and output sinks, sortable collections, objects printable as strings, cryptographic hashes, and so on.

Besides calling methods via interfaces, Go allows converting interface values to other types with a run-time type check. The language constructs to do so are the type assertion,[18] which checks against a single potential type, and the type switch,[19] which checks against multiple types.

Go types don't declare which interfaces they implement: having the required methods is implementing the interface.

In the simple program below, DevZero is an io.Reader yielding an infinite stream of zeroes, like Unix /dev/zero. main() creates a DevZero, then passes it to the standard library's io.CopyN(io.Writer, io.Reader, int) to copy ten zero bytes to a buffer. Note that no declaration that DevZero is an io.Reader was necessary, or even possible in Go:

package main

import (
	"bytes"
	"fmt"
	"io"
)

type DevZero struct{}

func (z *DevZero) Read(p []byte) (n int, err error) {
	for i := range p {
		p[i] = 0
	}
	return len(p), nil
}

func main() {
	buffer := bytes.NewBuffer(nil)
	devZero := new(DevZero)
	// copy 10 bytes from devZero to buffer
	io.CopyN(buffer, devZero, 10)
	fmt.Println(buffer.Bytes())
}

(You can run or edit this example online.)

interface{}, the empty interface, is an important corner case because it can refer to an item of any concrete type. Code using the empty interface can't simply call methods (or built-in operators) on a referred-to object, but it can store the interface value, check if the object satisfies a more specific interface (or if it's of a specific type), or inspect it with Go's reflect package.[20] Because interface{} can refer to any value, it's a limited way to escape the restrictions of static typing, like void* in C but with additional run-time type checks.

Go does not have interface inheritance, but one interface type can embed another; then the embedding interface requires all of the methods required by the embedded interface.[14]

Interface values are implemented as a pointer to data and a second pointer to run-time type information.[21] So, modifications through an interface value affect the original object, and like other pointers, interface values are nil if uninitialized.[22] Because type information is included in the interface value, there's no type-information pointer in the underlying object, unlike in languages like Java. So, the interface system doesn't impose per-object memory overhead for objects not accessed via interface, and Go structs are stored less like Java objects and more like C structs or C# ValueTypes.

Name visibility

Visibility of structure, structure fields, variables, constants, methods, top-level types and functions outside their defining package is defined implicitly according to the capitalization of their identifier. If the identifier starts with a capital letter, the identifier is visible from outside the package.[23]

Concurrency

Go provides goroutines, small lightweight threads; the name alludes to coroutines. Goroutines are created with the go statement from anonymous or named functions.

Goroutines are executed concurrently with other goroutines, including their caller. They do not necessarily run in separate threads, but a group of goroutines can be multiplexed onto multiple threads, allowing parallel execution. Execution control is moved between them by blocking them when sending or receiving messages over channels. Channels are bounded buffers, not network connections.

Goroutines can share data with other goroutines. Race conditions can occur in concurrent Go programs. Concurrent Go programs are not memory safe.[24]

Implementations

There are currently two major Go compilers available for Unix variants and Windows:

  • 6g/8g/5g (the compilers for AMD64, x86, and ARM respectively) with their supporting tools (collectively known as "gc") based on Thompson's previous work on Plan 9's C toolchain.
  • gccgo, a GCC frontend written in C++,[25] and now officially supported as of version 4.6, albeit not part of the standard binary for gcc.[26]

Examples

Hello world

The following is a Hello world program in Go:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World")
}

Go's automatic semicolon insertion feature requires that opening braces not be placed on their own lines, and this is thus the preferred brace style. The examples shown comply with this style.[27]

Echo

Example illustrating how to write a program like the Unix echo command in Go:[28]

package main

import (
    "flag"
    "fmt"
    "strings"
)

func main() {
    var omitNewline bool
    flag.BoolVar(&omitNewline, "n", false, "don't print final newline")
    flag.Parse() // Scans the arg list and sets up flags.

    str := strings.Join(flag.Args(), " ")
    if omitNewline {
        fmt.Print(str)
    } else {
        fmt.Println(str)
    }
}

Reception

Go's initial release led to much discussion.

Michele Simionato wrote in an article for artima.com:[29]

Here I just wanted to point out the design choices about interfaces and inheritance. Such ideas are not new and it is a shame that no popular language has followed such particular route in the design space. I hope Go will become popular; if not, I hope such ideas will finally enter in a popular language, we are already 10 or 20 years too late :-(

Dave Astels at Engine Yard wrote:[30]

Go is extremely easy to dive into. There are a minimal number of fundamental language concepts and the syntax is clean and designed to be clear and unambiguous. Go is still experimental and still a little rough around the edges.

Ars Technica interviewed Rob Pike, one of the authors of Go, and asked why a new language was needed. He replied that:[31]

It wasn't enough to just add features to existing programming languages, because sometimes you can get more in the long run by taking things away. They wanted to start from scratch and rethink everything. ... [But they did not want] to deviate too much from what developers already knew because they wanted to avoid alienating Go's target audience.

Go was named Programming Language of the Year by the TIOBE Programming Community Index in its first year, 2009, for having a larger 12-month increase in popularity (in only 2 months, after its introduction in November) than any other language that year, and reached 13th place by January 2010,[32] surpassing established languages like Pascal. As of March 2013, it ranked 24th in the index.[33] Go is already in commercial use by several large organizations.[34]

Bruce Eckel stated:[35]

The complexity of C++ (even more complexity has been added in the new C++), and the resulting impact on productivity, is no longer justified. All the hoops that the C++ programmer had to jump through in order to use a C-compatible language make no sense anymore -- they're just a waste of time and effort. Now, Go makes much more sense for the class of problems that C++ was originally intended to solve.

Mascot

Go's mascot is a gopher designed by Renée French, who also designed Glenda, the Plan 9 Bunny. The logo and mascot are licensed under Creative Commons Attribution 3.0 license.[36]

Naming dispute

On the day of the general release of the language, Francis McCabe, developer of the Go! programming language (note the exclamation point), requested a name change of Google's language to prevent confusion with his language.[37] The issue was closed by a Google developer on 12 October 2010 with the custom status "Unfortunate" and with the following comment: "there are many computing products and services named Go. In the 11 months since our release, there has been minimal confusion of the two languages."[38]

See also

References

  1. ^ Google+ The Go Programming Language
  2. ^ "Go Porting Efforts". Go Language Resources. cat-v. 12 January 2010. Retrieved 18 January 2010.
  3. ^ "Text file LICENSE". The Go Programming Language. Google. Retrieved 5 October 2012.
  4. ^ "Additional IP Rights Grant". The Go Programming Language. Google. Retrieved 5 October 2012.
  5. ^ a b c "Language Design FAQ". golang.org. 16 January 2010. Retrieved 27 February 2010.
  6. ^ Kincaid, Jason (10 November 2009). "Google's Go: A New Programming Language That's Python Meets C++". TechCrunch. Retrieved 18 January 2010.
  7. ^ "Go FAQ: Is Google using Go internally?". Retrieved 9 March 2013.
  8. ^ "Installing Go". golang.org. The Go Authors. 11 June 2010. Retrieved 11 June 2010.
  9. ^ Pike, Rob. "The Go Programming Language". YouTube. Retrieved 1 July 2011.
  10. ^ Rob Pike (10 November 2009). The Go Programming Language (flv) (Tech talk). Google. Event occurs at 8:53.
  11. ^ Download and install packages and dependencies - go - The Go Programming Language; see [godoc.org] for addresses and documentation of some packages
  12. ^ Rob Pike, on The Changelog podcast
  13. ^ Rob Pike, Less is exponentially more
  14. ^ a b "The Go Memory Model". Google. Retrieved 5 January 2011. Cite error: The named reference "memmodel" was defined multiple times with different content (see the help page).
  15. ^ Release notes, 30 March 2010
  16. ^ "Proposal for an exception-like mechanism". golang-nuts. 25 March 2010. Retrieved 25 March 2010.
  17. ^ Reader - io - The Go Programming Language
  18. ^ Type Assertions - The Go Language Specification
  19. ^ Type switches - The Go Language Specification
  20. ^ reflect.ValueOf(i interface{}) converts an interface{} to a reflect.Value that can be further inspected
  21. ^ "Go Data Structures: Interfaces". Retrieved 15 November 2012.
  22. ^ Interface types - The Go Programming Language Specification
  23. ^ "A Tutorial for the Go Programming Language". The Go Programming Language. Google. Retrieved 10 March 2013. In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared.
  24. ^ "Go at Google: Language Design in the Service of Software Engineering". Google, Inc. "There is one important caveat: Go is not purely memory safe in the presence of concurrency."
  25. ^ "FAQ: Implementation". golang.org. 16 January 2010. Retrieved 18 January 2010.
  26. ^ "Installing GCC: Configuration". Retrieved 3 December 2011. Ada, Go and Objective-C++ are not default languages
  27. ^ "A Tutorial for the Go Programming Language". The Go Programming Language. Google. Retrieved 10 March 2010. The one surprise is that it's important to put the opening brace of a construct such as an if statement on the same line as the if; however, if you don't, there are situations that may not compile or may give the wrong result. The language forces the brace style to some extent.
  28. ^ "A Tutorial for the Go Programming Language". golang.org. 16 January 2010. Retrieved 18 January 2010.
  29. ^ Simionato, Michele (15 November 2009). "Interfaces vs Inheritance (or, watch out for Go!)". artima. Retrieved 15 November 2009.
  30. ^ Astels, Dave (9 November 2009). "Ready, Set, Go!". engineyard. Retrieved 9 November 2009.
  31. ^ Paul, Ryan (10 November 2009). "Go: new open source programming language from Google". Ars Technica. Retrieved 13 November 2009.
  32. ^ "Google's Go Wins Programming Language Of The Year Award". jaxenter. Retrieved 5 December 2012. {{cite web}}: |first= missing |last= (help)
  33. ^ "TIOBE Programming Community Index for August 2013". TIOBE Software. August 2013. Retrieved 16 August 2013.
  34. ^ "Organizations Using Go".
  35. ^ Bruce Eckel (27). "Calling Go from Python via JSON-RPC". Retrieved 29 August 2011. {{cite web}}: Check date values in: |date= and |year= / |date= mismatch (help); Unknown parameter |month= ignored (help)
  36. ^ "FAQ - The Go Programming Language". Golang.org. Retrieved 25 June 2013.
  37. ^ Claburn, Thomas (11 November 2009). "Google 'Go' Name Brings Accusations Of Evil'". InformationWeek. Retrieved 18 January 2010.
  38. ^ "Issue 9 - go - I have already used the name for *MY* programming language". Google Code. Google Inc. Retrieved 12 October 2010.

Template:Z148