last modified May 8, 2025
This tutorial explains how to use the println built-in function in Go.
We'll cover basic output with practical examples of debugging and logging.
The println function is a built-in function in Go that writes to
standard error. It's primarily used for debugging and temporary output during
development. Unlike fmt.Println, it doesn't require imports.
In Go, println accepts multiple arguments of any type and prints
space-separated values. It adds a newline at the end. The output format is
implementation-dependent and may vary across platforms.
The simplest use of println outputs values to standard error.
This example demonstrates basic printing of different value types.
Note: For production code, prefer fmt package.
package main
func main() {
println("Hello, Go!")
println(42)
println(3.14)
println(true)
println('A')
}
The example prints a string, integer, float, boolean, and rune. Each call
to println outputs on a new line. The output format is basic.
println can accept multiple arguments of different types.
This example shows how to print several values in one call.
package main
func main() {
name := "Alice"
age := 30
height := 1.75
println("Name:", name, "Age:", age, "Height:", height)
a, b := 10, 20
println("Values:", a, b, "Sum:", a+b)
}
The function prints all arguments space-separated. Expressions are evaluated
before printing. The output format is less customizable than fmt.
println is often used for quick debugging during development.
This example demonstrates its use for variable inspection.
package main
func calculate(x, y int) int {
println("calculate called with", x, y)
result := x * y
println("intermediate result:", result)
return result + 1
}
func main() {
a := 5
b := 7
println("Before calculation")
res := calculate(a, b)
println("Final result:", res)
}
The debug prints help track function calls and intermediate values. This is useful for quick diagnostics without proper logging setup.
This example compares println with fmt.Println.
It highlights formatting differences between the two approaches.
package main
import "fmt"
func main() {
value := 3.141592653589793
println("Built-in println:", value)
fmt.Println("fmt.Println:", value)
println("Built-in (struct):", struct{ x int }{42})
fmt.Println("fmt.Println (struct):", struct{ x int }{42})
}
fmt.Println provides better formatting for complex types.
Built-in println output is more basic and less consistent.
println can be safely used from multiple goroutines.
This example demonstrates concurrent printing.
package main
import (
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
println("Worker", id, "started")
time.Sleep(time.Second)
println("Worker", id, "finished")
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
println("All workers completed")
}
The output shows interleaved messages from different goroutines.
println handles concurrent calls safely, though output
may be mixed unpredictably.
This tutorial covered the println function in Go with practical
examples of debugging and temporary output scenarios.
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.
List all Golang tutorials.