Generics Basics
Slice Helper
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
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)
}
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"})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}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
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"})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}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
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"})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}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