Skip to main content

Sample Programs for Manual Testing

This page contains a list of sample programs that can be used as a starting point to manually try out the language implementation.

Sequential Constructs

Hello World

package main

import (
"fmt"
"sync"
)

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

Fibonacci

package main

import "fmt"

func fibonacci(n int32) int32 {
if n <= 1 {
return n
}
return fibonacci(n-1) + fibonacci(n-2)
}

func main() {
n := 10
fmt.Println(fibonacci(n)) // Prints 55
}

Pascal Triangle

package main

import "fmt"

func main() {
var triangle [10][10]int32
n := 10
for i := 0; i < n; i++ {
triangle[i][0] = 1
triangle[i][i] = 1
for j := 1; j < i; j++ {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]
}
}
fmt.Println(triangle)
}

Array Sum using Reduce

package main

import "fmt"

func main() {
var arr [10]int32
for i := 0; i < 10; i++ {
arr[i] = i
}
f := func(a int32, b int32) int32 {
return a + b
}
answer := reduce(arr, f, 0)
fmt.Println(answer()) // Prints 45
}

func reduce(arr [10]int32, combiner func(int32, int32) int32, init int32) func() int32 {
return func() int32 {
sum := init
for i := 0; i < 10; i++ {
sum = combiner(sum, arr[i])
}
return sum
}
}

Global Variables Sorting

package main

import "fmt"

var x int32 = f() + 1

func f() int32 {
// var z int32 = x + 1 // This will cause a cyclic dependency error.
return y
}

var y int32 = 10

func main() {
// The declaration order after sorting will be y, f, x, main.
fmt.Println(x) // Prints 11
}

Points and Lines

package main

import "fmt"

type Line struct {
start Point
end Point
}

type Shape struct {
lines [10]Line
}

type Point struct {
x float32
y float32
}

func (p Point) squareDistance(q Point) float32 {
return (p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y)
}

func (l Line) length() float32 {
return l.start.squareDistance(l.end)
}

func (s Shape) perimeter() float32 {
var sum float32
for i := 0; i < 10; i++ {
sum = sum + s.lines[i].length()
}
return sum
}

func main() {
var p1 Point
p1.x = 1.0
p1.y = 2.0

var p2 Point
p2.x = 3.0
p2.y = 4.0

fmt.Println(p1.squareDistance(p2)) // Prints 8.0

var l1 Line
l1.start = p1
l1.end = p2

fmt.Println(l1.length()) // Prints 8.0

var s Shape
s.lines[0] = l1

fmt.Println(s.perimeter()) // Prints 8.0
}

Concurrent Constructs

Increment with a Race Condition

package main

import (
"fmt"
"sync"
)

var x = 0

func increment(wg sync.WaitGroup) {
for i := 0; i < 100; i++ {
x++
}
wg.Done()
}

func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(wg)
}
wg.Wait()
fmt.Println(x) // does not print 1000
}

Increment with Synchronization (mutex)

package main

import (
"fmt"
"sync"
)

var x = 0

func increment(wg sync.WaitGroup, m sync.Mutex) {
for i := 0; i < 100; i++ {
m.Lock()
x++
m.Unlock()
}
wg.Done()
}

func main() {
var wg sync.WaitGroup
var m sync.Mutex
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(wg, m)
}
wg.Wait()
fmt.Println(x) // prints 1000
}

Increment with Synchronization (channel)

package main

import (
"fmt"
"sync"
)

var x = 0

func increment(wg sync.WaitGroup, ch chan int32) {
for i := 0; i < 100; i++ {
ch <- 1
x++
<-ch
}
wg.Done()
}

func main() {
var wg sync.WaitGroup
ch := make(chan int32, 1)
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(wg, ch)
}
wg.Wait()
fmt.Println(x) // prints 1000
}

Producer-Consumer

package main

import (
"fmt"
"sync"
)

var wg sync.WaitGroup
var m sync.Mutex

func producer(ch chan int32) {
for i := 0; i < 10; i++ {
m.Lock()
ch <- i
m.Unlock()
}
wg.Done()
}

func consumer(ch chan int32) {
for i := 0; i < 10; i++ {
m.Lock()
fmt.Println(<-ch)
m.Unlock()
}
wg.Done()
}

func main() {
ch := make(chan int32, 10)
wg.Add(2)
go producer(ch)
go consumer(ch)
wg.Wait()
}