Circular Linked Lists in Go
package main
import (
"container/ring"
"fmt"
)
func main() {
// Initialize a circular list with 5 elements
circularList := ring.New(5)
circularList.Value = 10
circularList.Next().Value = 20
circularList.Next().Next().Value = 30
circularList.Prev().Value = 40
circularList.Prev().Prev().Value = 50
// Traverse and print all elements (10-20-30-50-40)
circularList.Do(func(item interface{}) {
fmt.Println(item)
})
// Move 3 positions from root (10) and print value (50)
fmt.Println(circularList.Move(3).Value)
// Create and link a new single-element ring
singleNode := ring.New(1)
singleNode.Value = 99
circularList.Link(singleNode)
// Print updated list (10-99-20-30-50-40)
circularList.Do(func(item interface{}) {
fmt.Println(item)
})
// Remove one node after root (99)
circularList.Unlink(1)
circularList.Do(func(item interface{}) {
fmt.Println(item)
})
}
Function Variants in Go
Basic Function Calls
package main
import "fmt"
func main() {
noParams()
withParam(5)
sum := add(3, 4)
result := namedReturn(2, 3)
fmt.Println(sum, result)
}
func noParams() {
fmt.Println("Parameterless function")
}
func withParam(num int) {
fmt.Println("Parameter value:", num)
}
func add(x, y int) int {
return x + y
}
func namedReturn(a, b int) (total int) {
total = a + b
return
}
Multiple Return Values
package main
import "fmt"
func main() {
name, years := getUserInfo()
fmt.Println(name, years)
firstName, _ := getUserInfo()
fmt.Println(firstName)
}
func getUserInfo() (string, int) {
return "John", 25
}
Variaidc Functions
package main
import "fmt"
func main() {
printNames("Alice", "Bob", "Charlie")
}
func printNames(names ...string) {
for index, name := range names {
fmt.Printf("%d: %s\n", index, name)
}
}
Anonymous Functions
package main
import "fmt"
func main() {
func() {
fmt.Println("Immediate execution")
}()
func(msg string) {
fmt.Println("Message:", msg)
}("Hello")
secret := func() string {
return "confidential"
}()
fmt.Println(secret)
}
Function Variables
package main
import "fmt"
func main() {
var printer func()
printer = func() {
fmt.Println("Default message")
}
printer()
printer = alternateMessage
printer()
}
func alternateMessage() {
fmt.Println("Alternate output")
}
Higher-Order Functions
package main
import "fmt"
func main() {
executeCallback(func(input string) {
fmt.Println("Received:", input)
})
}
func executeCallback(handler func(string)) {
handler("Sample data")
}
Functions as Return Values
package main
import "fmt"
func main() {
generator := createCounter()
count := generator()
fmt.Println(count)
}
func createCounter() func() int {
return func() int {
return 1000
}
}
Cross-Package Function Calls
// main.go
package main
import "project/utils"
func main() {
utils.PublicFunction()
}
// utils/helper.go
package utils
import "fmt"
func PublicFunction() {
fmt.Println("Exported function")
}
Global Variables
package main
import "fmt"
var (
username = "admin"
accessLevel = 3
)
func main() {
fmt.Println(username, accessLevel)
}