A generic helper can work with slices that hold different element types.

generic slice Generic slice helpers reuse the same indexing and length logic across element types. The trace uses a concrete string slice and shows the generic shape in a comment.

Slice Helper

extra
slice_helper.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

// Generic shape: Last[T any](items []T) T
func LastString(items []string) string {
	return items[len(items)-1]
}

func main() {
	var extra = "go"
	names := []string{"ada", "grace", extra}
	last := LastString(names)

	fmt.Println("count=", len(names))
	fmt.Println("last=", last)
	fmt.Println("same=", last == extra)
}
package main

import "fmt"

// Generic shape: Last[T any](items []T) T
func LastString(items []string) string {
	return items[len(items)-1]
}

func main() {
	var extra = "ruby"
	names := []string{"ada", "grace", extra}
	last := LastString(names)

	fmt.Println("count=", len(names))
	fmt.Println("last=", last)
	fmt.Println("same=", last == extra)
}
package main

import "fmt"

// Generic shape: Last[T any](items []T) T
func LastString(items []string) string {
	return items[len(items)-1]
}

func main() {
	var extra = "python"
	names := []string{"ada", "grace", extra}
	last := LastString(names)

	fmt.Println("count=", len(names))
	fmt.Println("last=", last)
	fmt.Println("same=", last == extra)
}
  1. extra ← "go", names ← []string{"ada", "grace", "go"}

    10func main() {11  var extra→ "go" = "go" //@extra="ruby", "python"12  names→ []string{"ada", "grace", "go"} := []string{"ada", "grace", extra"go"}13  last := LastString(names[]string{"ada", "grace", "go"})
  2. func LastString(items []string) string

    5// Generic shape: Last[T any](items []T) T6func LastString(items[]string{"ada", "grace", "go"} []string) string {7  return items[]string{"ada", "grace", "go"}[len(items)-1]8}
  3. last ← "go"

    12  names := []string{"ada", "grace", extra}13  last→ "go" := LastString(names[]string{"ada", "grace", "go"})1415  fmt.Println("count=", len(names[]string{"ada", "grace", "go"}))16  fmt.Println("last=", last"go")17  fmt.Println("same=", last"go" == extra"go")18}
    outputcount= 3
    last= go
    same= true
  1. extra ← "ruby", names ← []string{"ada", "grace", "ruby"}

    10func main() {11  var extra→ "ruby" = "ruby"12  names→ []string{"ada", "grace", "ruby"} := []string{"ada", "grace", extra"ruby"}13  last := LastString(names[]string{"ada", "grace", "ruby"})
  2. func LastString(items []string) string

    5// Generic shape: Last[T any](items []T) T6func LastString(items[]string{"ada", "grace", "ruby"} []string) string {7  return items[]string{"ada", "grace", "ruby"}[len(items)-1]8}
  3. last ← "ruby"

    12  names := []string{"ada", "grace", extra}13  last→ "ruby" := LastString(names[]string{"ada", "grace", "ruby"})1415  fmt.Println("count=", len(names[]string{"ada", "grace", "ruby"}))16  fmt.Println("last=", last"ruby")17  fmt.Println("same=", last"ruby" == extra"ruby")18}
    outputcount= 3
    last= ruby
    same= true
  1. extra ← "python", names ← []string{"ada", "grace", "python"}

    10func main() {11  var extra→ "python" = "python"12  names→ []string{"ada", "grace", "python"} := []string{"ada", "grace", extra"python"}13  last := LastString(names[]string{"ada", "grace", "python"})
  2. func LastString(items []string) string

    5// Generic shape: Last[T any](items []T) T6func LastString(items[]string{"ada", "grace", "python"} []string) string {7  return items[]string{"ada", "grace", "python"}[len(items)-1]8}
  3. last ← "python"

    12  names := []string{"ada", "grace", extra}13  last→ "python" := LastString(names[]string{"ada", "grace", "python"})1415  fmt.Println("count=", len(names[]string{"ada", "grace", "python"}))16  fmt.Println("last=", last"python")17  fmt.Println("same=", last"python" == extra"python")18}
    outputcount= 3
    last= python
    same= true