gc (6g, 8g)
Реализация языка программирования GoРеализация Go, написанная на C. В настоящий момент поддерживает только платформы FreeBSD, Linux, Native Client и Mac OS X.
gc 6 предназначен для архитектуры amd64. Наиболее зрелая реализация, компилятор снабжен оптимизатором и выдает хороший код. gc 8 предназначен для 386 и по качеству сравним с gc 6. gc 5 — незавершенный компилятор для архитектуры arm, находящийся в разработке.
Примеры:
Hello, World!:
Пример для версий gc-2010-07-14package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Факториал:
Пример для версий gc-2010-07-14В примере показаны рекурсивный и итеративный способы вычисления факториала, а также создание обобщенной функции, которая выводит их результаты универсальным способом.
package main
import "fmt"
//Recursive Factorial
func factr(n uint64) uint64 {
if (n < 2) { return 1 }
return n * factr(n-1)
}
//Iterative Factorial
func facti(n uint64) uint64 {
var ret uint64 = 1
for ; n > 0; n-- {
ret *= n
}
return ret
}
func printFact(fact func(uint64) uint64) {
for i := 0; i < 17; i++ {
fmt.Printf("%d! = %d\n", i, fact(uint64(i)))
}
}
func main() {
printFact(factr)
fmt.Println("--")
printFact(facti)
}
Числа Фибоначчи:
Пример для версий gc-2010-07-14В этом примере показаны все три способа вычисления чисел Фибоначчи.
package main
import ("fmt"
"math")
//Fibonacci Recursive
func fibr(n int) int {
if n < 2 { return 1 }
return fibr(n-2) + fibr(n-1)
}
//Fibonacci Iterative
func fibi(n int) int {
var a, b int = 1, 1
for i := 0; i < n; i++ {
a, b = b, a+b
}
return a
}
//Fibonacci Binet
func fibb(n int) int {
g := (1 + math.Sqrt(5)) / 2
ret := (math.Pow(g, float64(n)) - math.Pow(1-g, float64(n))) / math.Sqrt(5)
return int(ret)
}
type fibfunc func(int) int
//Implements a general printing method for fibonacci functions
func printFib(fib fibfunc, a, b int) {
for i := a; i < b; i++ {
fmt.Printf("%d, ", fib(i))
}
fmt.Println("...")
}
func main() {
printFib(fibr, 0, 16)
printFib(fibi, 0, 16)
printFib(fibb, 1, 17)
}
Квадратное уравнение:
Пример для версий gc-2010-07-14При импорте нескольких пакетов перед именем одного из них можно поставить точку, и использовать его функции без префикса имени пакета, как fmt
в этом примере.
Чтобы прочитать число, введенное пользователем, следует прочитать строку из консоли, убрать последний символ переноса строки и преобразовать ее в нужный формат числа. В данном случае входные переменные будут целочисленными, но в дальнейшем будут использоваться для вычислений с плавающей точкой. Go не поддерживает неявные преобразования типов, поэтому лучше сразу трактовать входные данные как float64 (тип данных, который передается в качестве аргумента в math.Sqrt
).
= — простое присваивание, := — присваивание с объявлением переменной, находящейся слева от знака присваивания. Следует отметить, что объявленные, но неиспользованные переменные считаются ошибками компиляции.
package main
import (
"os"
. "fmt"
"math"
"bufio"
"strconv")
func main() {
in := bufio.NewReader(os.Stdin)
line, err := in.ReadString('\n')
line = line[0 : len(line)-1]
A, err := strconv.Atof64(line)
if (A == 0) {
Print("Not a quadratic equation.")
return
}
line, err = in.ReadString('\n')
line = line[0 : len(line)-1]
B, err := strconv.Atof64(line)
line, err = in.ReadString('\n')
line = line[0 : len(line)-1]
C, err := strconv.Atof64(line)
if err != nil {
Print(err)
}
D := B*B-4*A*C
if (D == 0) {
Printf("x = %f", -B/2/A)
return
}
if (D>0) {
Printf("x1 = %f\nx2 = %f", -B/2/A + math.Sqrt(D)/2/A, -B/2/A - math.Sqrt(D)/2/A)
} else {
Printf("x1 = (%f, %f)\nx2 = (%f, %f)", -B/2/A, math.Sqrt(-D)/2/A, -B/2/A, -math.Sqrt(-D)/2/A)
}
}
Комментарии
]]>blog comments powered by Disqus
]]>