95 строки
1,5 КиБ
Go
95 строки
1,5 КиБ
Go
package main
|
|
|
|
type Thing struct {
|
|
name string
|
|
}
|
|
|
|
func (t Thing) String() string {
|
|
return t.name
|
|
}
|
|
|
|
type Stringer interface {
|
|
String() string
|
|
}
|
|
|
|
const SIX = 6
|
|
|
|
func main() {
|
|
println("Hello world from Go!")
|
|
println("The answer is:", calculateAnswer())
|
|
println("5 ** 2 =", square(5))
|
|
println("3 + 12 =", add(3, 12))
|
|
println("fib(11) =", fib(11))
|
|
println("sumrange(100) =", sumrange(100))
|
|
println("strlen foo:", strlen("foo"))
|
|
|
|
thing := &Thing{"foo"}
|
|
println("thing:", thing.String())
|
|
printItf(5)
|
|
printItf(byte('x'))
|
|
printItf("foo")
|
|
printItf(*thing)
|
|
printItf(thing)
|
|
printItf(Stringer(thing))
|
|
s := Stringer(thing)
|
|
println("Stringer.String():", s.String())
|
|
|
|
runFunc(hello, 5) // must be indirect to avoid obvious inlining
|
|
}
|
|
|
|
func runFunc(f func(int), arg int) {
|
|
f(arg)
|
|
}
|
|
|
|
func hello(n int) {
|
|
println("hello from function pointer:", n)
|
|
}
|
|
|
|
func strlen(s string) int {
|
|
return len(s)
|
|
}
|
|
|
|
func printItf(val interface{}) {
|
|
switch val := val.(type) {
|
|
case int:
|
|
println("is int:", val)
|
|
case byte:
|
|
println("is byte:", val)
|
|
case string:
|
|
println("is string:", val)
|
|
case Thing:
|
|
println("is Thing:", val.String())
|
|
case *Thing:
|
|
println("is *Thing:", val.String())
|
|
default:
|
|
println("is ?")
|
|
}
|
|
}
|
|
|
|
func calculateAnswer() int {
|
|
seven := 7
|
|
return SIX * seven
|
|
}
|
|
|
|
func square(n int) int {
|
|
return n * n
|
|
}
|
|
|
|
func add(a, b int) int {
|
|
return a + b
|
|
}
|
|
|
|
func fib(n int) int {
|
|
if n <= 2 {
|
|
return 1
|
|
}
|
|
return fib(n-1) + fib(n-2)
|
|
}
|
|
|
|
func sumrange(n int) int {
|
|
sum := 0
|
|
for i := 1; i <= n; i++ {
|
|
sum += i
|
|
}
|
|
return sum
|
|
}
|