Piddly things

This commit is contained in:
Adam 2013-08-13 19:59:19 -07:00
parent f733ea36d2
commit 4d705abd99
2 changed files with 179 additions and 179 deletions

View File

@ -18,7 +18,7 @@ help with large-scale programming.
Go comes with a great standard library and an enthusiastic community. Go comes with a great standard library and an enthusiastic community.
```Go ```go
// Single line comment // Single line comment
/* Multi- /* Multi-
line comment */ line comment */
@ -29,260 +29,260 @@ package main
// Import declaration declares library packages referenced in this file. // Import declaration declares library packages referenced in this file.
import ( import (
"fmt" // A package in the Go standard library "fmt" // A package in the Go standard library
"net/http" // Yes, a web server! "net/http" // Yes, a web server!
"strconv" // String conversions "strconv" // String conversions
) )
// A function definition. Main is special. It is the entry point for the // A function definition. Main is special. It is the entry point for the
// executable program. Love it or hate it, Go uses brace brackets. // executable program. Love it or hate it, Go uses brace brackets.
func main() { func main() {
// Println outputs a line to stdout. // Println outputs a line to stdout.
// Qualify it with the package name, fmt. // Qualify it with the package name, fmt.
fmt.Println("Hello world!") fmt.Println("Hello world!")
// Call another function within this package. // Call another function within this package.
beyondHello() beyondHello()
} }
// Functions have parameters in parentheses. // Functions have parameters in parentheses.
// If there are no parameters, empty parens are still required. // If there are no parameters, empty parens are still required.
func beyondHello() { func beyondHello() {
var x int // Variable declaration. Variables must be declared before use. var x int // Variable declaration. Variables must be declared before use.
x = 3 // Variable assignment. x = 3 // Variable assignment.
// "Short" declarations use := to infer the type, declare, and assign. // "Short" declarations use := to infer the type, declare, and assign.
y := 4 y := 4
sum, prod := learnMultiple(x, y) // function returns two values sum, prod := learnMultiple(x, y) // function returns two values
fmt.Println("sum:", sum, "prod:", prod) // simple output fmt.Println("sum:", sum, "prod:", prod) // simple output
learnTypes() // < y minutes, learn more! learnTypes() // < y minutes, learn more!
} }
// Functions can have parameters and (multiple!) return values. // Functions can have parameters and (multiple!) return values.
func learnMultiple(x, y int) (sum, prod int) { func learnMultiple(x, y int) (sum, prod int) {
return x + y, x * y // return two values return x + y, x * y // return two values
} }
// Some built-in types and literals. // Some built-in types and literals.
func learnTypes() { func learnTypes() {
// Short declaration usually gives you what you want. // Short declaration usually gives you what you want.
s := "Learn Go!" // string type s := "Learn Go!" // string type
s2 := `A "raw" string literal s2 := `A "raw" string literal
can include line breaks.` // same string type can include line breaks.` // same string type
// non-ASCII literal. Go source is UTF-8. // non-ASCII literal. Go source is UTF-8.
g := 'Σ' // rune type, an alias for uint32, holds a UTF-8 code point g := 'Σ' // rune type, an alias for uint32, holds a UTF-8 code point
f := 3.14195 // float64, an IEEE-754 64-bit floating point number f := 3.14195 // float64, an IEEE-754 64-bit floating point number
c := 3 + 4i // complex128, represented internally with two float64s c := 3 + 4i // complex128, represented internally with two float64s
// Var syntax with an initializers. // Var syntax with an initializers.
var u uint = 7 // unsigned, but implementation dependent size as with int var u uint = 7 // unsigned, but implementation dependent size as with int
var pi float32 = 22. / 7 var pi float32 = 22. / 7
// Conversion syntax with a short declaration. // Conversion syntax with a short declaration.
n := byte('\n') // byte is an alias for uint8 n := byte('\n') // byte is an alias for uint8
// Arrays have size fixed at compile time. // Arrays have size fixed at compile time.
var a4 [4]int // an array of 4 ints, initialized to all 0 var a4 [4]int // an array of 4 ints, initialized to all 0
a3 := [...]int{3, 1, 5} // an array of 3 ints, initialized as shown a3 := [...]int{3, 1, 5} // an array of 3 ints, initialized as shown
// Slices have dynamic size. Arrays and slices each have advantages // Slices have dynamic size. Arrays and slices each have advantages
// but use cases for slices are much more common. // but use cases for slices are much more common.
s3 := []int{4, 5, 9} // compare to a3. no ellipsis here s3 := []int{4, 5, 9} // compare to a3. no ellipsis here
s4 := make([]int, 4) // allocates slice of 4 ints, initialized to all 0 s4 := make([]int, 4) // allocates slice of 4 ints, initialized to all 0
var d2 [][]float64 // declaration only, nothing allocated here var d2 [][]float64 // declaration only, nothing allocated here
bs := []byte("a slice") // type conversion syntax bs := []byte("a slice") // type conversion syntax
p, q := learnMemory() // declares p, q to be type pointer to int. p, q := learnMemory() // declares p, q to be type pointer to int.
fmt.Println(*p, *q) // * follows a pointer. This prints two ints. fmt.Println(*p, *q) // * follows a pointer. This prints two ints.
// Maps are a dynamically growable associative array type, like the // Maps are a dynamically growable associative array type, like the
// hash or dictionary types of some other languages. // hash or dictionary types of some other languages.
m := map[string]int{"three": 3, "four": 4} m := map[string]int{"three": 3, "four": 4}
m["one"] = 1 m["one"] = 1
// Unused variables are an error in Go. // Unused variables are an error in Go.
// The underbar lets you "use" a variable but discard its value. // The underbar lets you "use" a variable but discard its value.
_, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs _, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs
// Output of course counts as using a variable. // Output of course counts as using a variable.
fmt.Println(s, c, a4, s3, d2, m) fmt.Println(s, c, a4, s3, d2, m)
learnFlowControl() // back in the flow learnFlowControl() // back in the flow
} }
// Go is fully garbage collected. It has pointers but no pointer arithmetic. // Go is fully garbage collected. It has pointers but no pointer arithmetic.
// You can make a mistake with a nil pointer, but not by incrementing a pointer. // You can make a mistake with a nil pointer, but not by incrementing a pointer.
func learnMemory() (p, q *int) { func learnMemory() (p, q *int) {
// Named return values p and q have type pointer to int. // Named return values p and q have type pointer to int.
p = new(int) // built-in function new allocates memory. p = new(int) // built-in function new allocates memory.
// The allocated int is initialized to 0, p is no longer nil. // The allocated int is initialized to 0, p is no longer nil.
s := make([]int, 20) // allocate 20 ints as a single block of memory s := make([]int, 20) // allocate 20 ints as a single block of memory
s[3] = 7 // assign one of them s[3] = 7 // assign one of them
r := -2 // declare another local variable r := -2 // declare another local variable
return &s[3], &r // & takes the address of an object. return &s[3], &r // & takes the address of an object.
} }
func expensiveComputation() int { func expensiveComputation() int {
return 1e6 return 1e6
} }
func learnFlowControl() { func learnFlowControl() {
// If statements require brace brackets, and do not require parens. // If statements require brace brackets, and do not require parens.
if true { if true {
fmt.Println("told ya") fmt.Println("told ya")
} }
// Formatting is standardized by the command line command "go fmt." // Formatting is standardized by the command line command "go fmt."
if false { if false {
// pout // pout
} else { } else {
// gloat // gloat
} }
// Use switch in preference to chained if statements. // Use switch in preference to chained if statements.
x := 1 x := 1
switch x { switch x {
case 0: case 0:
case 1: case 1:
// cases don't "fall through" // cases don't "fall through"
case 2: case 2:
// unreached // unreached
} }
// Like if, for doesn't use parens either. // Like if, for doesn't use parens either.
for x := 0; x < 3; x++ { // ++ is a statement for x := 0; x < 3; x++ { // ++ is a statement
fmt.Println("iteration", x) fmt.Println("iteration", x)
} }
// x == 1 here. // x == 1 here.
// For is the only loop statement in Go, but it has alternate forms. // For is the only loop statement in Go, but it has alternate forms.
for { // infinite loop for { // infinite loop
break // just kidding break // just kidding
continue // unreached continue // unreached
} }
// As with for, := in an if statement means to declare and assign y first, // As with for, := in an if statement means to declare and assign y first,
// then test y > x. // then test y > x.
if y := expensiveComputation(); y > x { if y := expensiveComputation(); y > x {
x = y x = y
} }
// Function literals are closures. // Function literals are closures.
xBig := func() bool { xBig := func() bool {
return x > 100 // references x declared above switch statement. return x > 100 // references x declared above switch statement.
} }
fmt.Println("xBig:", xBig()) // true (we last assigned 1e6 to x) fmt.Println("xBig:", xBig()) // true (we last assigned 1e6 to x)
x /= 1e5 // this makes it == 10 x /= 1e5 // this makes it == 10
fmt.Println("xBig:", xBig()) // false now fmt.Println("xBig:", xBig()) // false now
// When you need it, you'll love it. // When you need it, you'll love it.
goto love goto love
love: love:
learnInterfaces() // Good stuff coming up! learnInterfaces() // Good stuff coming up!
} }
// Define Stringer as an interface type with one method, String. // Define Stringer as an interface type with one method, String.
type Stringer interface { type Stringer interface {
String() string String() string
} }
// Define pair as a struct with two fields, ints named x and y. // Define pair as a struct with two fields, ints named x and y.
type pair struct { type pair struct {
x, y int x, y int
} }
// Define a method on type pair. Pair now implements Stringer. // Define a method on type pair. Pair now implements Stringer.
func (p pair) String() string { // p is called the "receiver" func (p pair) String() string { // p is called the "receiver"
// Sprintf is another public function in package fmt. // Sprintf is another public function in package fmt.
// Dot syntax references fields of p. // Dot syntax references fields of p.
return fmt.Sprintf("(%d, %d)", p.x, p.y) return fmt.Sprintf("(%d, %d)", p.x, p.y)
} }
func learnInterfaces() { func learnInterfaces() {
// Brace syntax is a "struct literal." It evaluates to an initialized // Brace syntax is a "struct literal." It evaluates to an initialized
// struct. The := syntax declares and initializes p to this struct. // struct. The := syntax declares and initializes p to this struct.
p := pair{3, 4} p := pair{3, 4}
fmt.Println(p.String()) // call String method of p, of type pair. fmt.Println(p.String()) // call String method of p, of type pair.
var i Stringer // declare i of interface type Stringer. var i Stringer // declare i of interface type Stringer.
i = p // valid because pair implements Stringer i = p // valid because pair implements Stringer
// Call String method of i, of type Stringer. Output same as above. // Call String method of i, of type Stringer. Output same as above.
fmt.Println(i.String()) fmt.Println(i.String())
// Functions in the fmt package call the String method to ask an object // Functions in the fmt package call the String method to ask an object
// for a printable representation of itself. // for a printable representation of itself.
fmt.Println(p) // output same as above. Println calls String method. fmt.Println(p) // output same as above. Println calls String method.
fmt.Println(i) // output same as above fmt.Println(i) // output same as above
learnErrorHandling() learnErrorHandling()
} }
func learnErrorHandling() { func learnErrorHandling() {
// ", ok" idiom used to tell if something worked or not. // ", ok" idiom used to tell if something worked or not.
m := map[int]string{3: "three", 4: "four"} m := map[int]string{3: "three", 4: "four"}
if x, ok := m[1]; !ok { // ok will be false because 1 is not in the map. if x, ok := m[1]; !ok { // ok will be false because 1 is not in the map.
fmt.Println("no one there") fmt.Println("no one there")
} else { } else {
fmt.Print(x) // x would be the value, if it were in the map. fmt.Print(x) // x would be the value, if it were in the map.
} }
// An error value communicates not just "ok" but more about the problem. // An error value communicates not just "ok" but more about the problem.
if _, err := strconv.Atoi("non-int"); err != nil { // _ discards value if _, err := strconv.Atoi("non-int"); err != nil { // _ discards value
// prints "strconv.ParseInt: parsing "non-int": invalid syntax" // prints "strconv.ParseInt: parsing "non-int": invalid syntax"
fmt.Println(err) fmt.Println(err)
} }
// We'll revisit interfaces a little later. Meanwhile, // We'll revisit interfaces a little later. Meanwhile,
learnConcurrency() learnConcurrency()
} }
// c is a channel, a concurrency-safe communication object. // c is a channel, a concurrency-safe communication object.
func inc(i int, c chan int) { func inc(i int, c chan int) {
c <- i + 1 // <- is the "send" operator when a channel appears on the left. c <- i + 1 // <- is the "send" operator when a channel appears on the left.
} }
// We'll use inc to increment some numbers concurrently. // We'll use inc to increment some numbers concurrently.
func learnConcurrency() { func learnConcurrency() {
// Same make function used earlier to make a slice. Make allocates and // Same make function used earlier to make a slice. Make allocates and
// initializes slices, maps, and channels. // initializes slices, maps, and channels.
c := make(chan int) c := make(chan int)
// Start three concurrent goroutines. Numbers will be incremented // Start three concurrent goroutines. Numbers will be incremented
// concurrently, perhaps in parallel if the machine is capable and // concurrently, perhaps in parallel if the machine is capable and
// properly configured. All three send to the same channel. // properly configured. All three send to the same channel.
go inc(0, c) // go is a statement that starts a new goroutine. go inc(0, c) // go is a statement that starts a new goroutine.
go inc(10, c) go inc(10, c)
go inc(-805, c) go inc(-805, c)
// Read three results from the channel and print them out. // Read three results from the channel and print them out.
// There is no telling in what order the results will arrive! // There is no telling in what order the results will arrive!
fmt.Println(<-c, <-c, <-c) // channel on right, <- is "receive" operator. fmt.Println(<-c, <-c, <-c) // channel on right, <- is "receive" operator.
cs := make(chan string) // another channel, this one handles strings. cs := make(chan string) // another channel, this one handles strings.
cc := make(chan chan string) // a channel of channels. cc := make(chan chan string) // a channel of channels.
go func() { c <- 84 }() // start a new goroutine just to send a value go func() { c <- 84 }() // start a new goroutine just to send a value
go func() { cs <- "wordy" }() // again, for cs this time go func() { cs <- "wordy" }() // again, for cs this time
// Select has syntax like a switch statement but each case involves // Select has syntax like a switch statement but each case involves
// a channel operation. It selects a case at random out of the cases // a channel operation. It selects a case at random out of the cases
// that are ready to communicate. // that are ready to communicate.
select { select {
case i := <-c: // the value received can be assigned to a variable case i := <-c: // the value received can be assigned to a variable
fmt.Println("it's a", i) fmt.Println("it's a", i)
case <-cs: // or the value received can be discarded case <-cs: // or the value received can be discarded
fmt.Println("it's a string") fmt.Println("it's a string")
case <-cc: // empty channel, not ready for communication. case <-cc: // empty channel, not ready for communication.
fmt.Println("didn't happen.") fmt.Println("didn't happen.")
} }
// At this point a value was taken from either c or cs. One of the two // At this point a value was taken from either c or cs. One of the two
// goroutines started above has completed, the other will remain blocked. // goroutines started above has completed, the other will remain blocked.
learnWebProgramming() // Go does it. You want to do it too. learnWebProgramming() // Go does it. You want to do it too.
} }
// A single function from package http starts a web server. // A single function from package http starts a web server.
func learnWebProgramming() { func learnWebProgramming() {
// ListenAndServe first parameter is TCP address to listen at. // ListenAndServe first parameter is TCP address to listen at.
// Second parameter is an interface, specifically http.Handler. // Second parameter is an interface, specifically http.Handler.
err := http.ListenAndServe(":8080", pair{}) err := http.ListenAndServe(":8080", pair{})
fmt.Println(err) // don't ignore errors fmt.Println(err) // don't ignore errors
} }
// Make pair an http.Handler by implementing its only method, ServeHTTP. // Make pair an http.Handler by implementing its only method, ServeHTTP.
func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Serve data with a method of http.ResponseWriter // Serve data with a method of http.ResponseWriter
w.Write([]byte("You learned Go in Y minutes!")) w.Write([]byte("You learned Go in Y minutes!"))
} }
``` ```

View File

@ -4,7 +4,7 @@ contributors:
- ["Bastien Guerry", "http://bzg.fr"] - ["Bastien Guerry", "http://bzg.fr"]
translators: translators:
- ["Lucas Tadeu Teixeira", "http://ltt.me"] - ["Lucas Tadeu Teixeira", "http://ltt.me"]
lang: pt-br lang: pt-br
filename: learn-emacs-lisp-pt.el filename: learn-emacs-lisp-pt.el
--- ---
@ -30,9 +30,9 @@ filename: learn-emacs-lisp-pt.el
;; Realizar este tutorial não danificará seu computador, a menos ;; Realizar este tutorial não danificará seu computador, a menos
;; que você fique tão irritado a ponto de jogá-lo no chão. Neste caso, ;; que você fique tão irritado a ponto de jogá-lo no chão. Neste caso,
;; me abstenho de qualquer responsabilidade. Divirta-se! ;; me abstenho de qualquer responsabilidade. Divirta-se!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Abra o Emacs. ;; Abra o Emacs.
;; ;;
;; Aperte a tecla `q' para ocultar a mensagem de boas vindas. ;; Aperte a tecla `q' para ocultar a mensagem de boas vindas.
@ -45,11 +45,11 @@ filename: learn-emacs-lisp-pt.el
;; O buffer de rascunho (i.e., "scratch") é o buffer padrão quando ;; O buffer de rascunho (i.e., "scratch") é o buffer padrão quando
;; o Emacs é aberto. Você nunca está editando arquivos: você está ;; o Emacs é aberto. Você nunca está editando arquivos: você está
;; editando buffers que você pode salvar em um arquivo. ;; editando buffers que você pode salvar em um arquivo.
;; ;;
;; "Lisp interaction" refere-se a um conjunto de comandos disponíveis aqui. ;; "Lisp interaction" refere-se a um conjunto de comandos disponíveis aqui.
;; ;;
;; O Emacs possui um conjunto de comandos embutidos (disponíveis em ;; O Emacs possui um conjunto de comandos embutidos (disponíveis em
;; qualquer buffer) e vários subconjuntos de comandos disponíveis ;; qualquer buffer) e vários subconjuntos de comandos disponíveis
;; quando você ativa um modo específico. Aqui nós utilizamos ;; quando você ativa um modo específico. Aqui nós utilizamos
;; `lisp-interaction-mode', que possui comandos para interpretar e navegar ;; `lisp-interaction-mode', que possui comandos para interpretar e navegar
;; em código Elisp. ;; em código Elisp.
@ -137,7 +137,7 @@ filename: learn-emacs-lisp-pt.el
;; => [a tela exibirá duas janelas e o cursor estará no buffer *test*] ;; => [a tela exibirá duas janelas e o cursor estará no buffer *test*]
;; Posicione o mouse sobre a janela superior e clique com o botão ;; Posicione o mouse sobre a janela superior e clique com o botão
;; esquerdo para voltar. Ou você pode utilizar `C-xo' (i.e. segure ;; esquerdo para voltar. Ou você pode utilizar `C-xo' (i.e. segure
;; ctrl-x e aperte o) para voltar para a outra janela, de forma interativa. ;; ctrl-x e aperte o) para voltar para a outra janela, de forma interativa.
;; Você pode combinar várias "sexps" com `progn': ;; Você pode combinar várias "sexps" com `progn':