Implementing Circular Linked Lists and Function Variants in Go

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)
}

Tags: Go programming Data Structures functions

Posted on Thu, 02 Jul 2026 16:36:48 +0000 by GBahle