// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package typeutil_test import ( "fmt" "go/ast" "go/parser" "go/token" "go/types" "sort" "honnef.co/go/tools/go/types/typeutil" ) func ExampleMap() { const source = `package P var X []string var Y []string const p, q = 1.0, 2.0 func f(offset int32) (value byte, ok bool) func g(rune) (uint8, bool) ` // Parse and type-check the package. fset := token.NewFileSet() f, err := parser.ParseFile(fset, "P.go", source, 0) if err != nil { panic(err) } pkg, err := new(types.Config).Check("P", fset, []*ast.File{f}, nil) if err != nil { panic(err) } scope := pkg.Scope() // Group names of package-level objects by their type. var namesByType typeutil.Map // value is []string for _, name := range scope.Names() { T := scope.Lookup(name).Type() names, _ := namesByType.At(T).([]string) names = append(names, name) namesByType.Set(T, names) } // Format, sort, and print the map entries. var lines []string namesByType.Iterate(func(T types.Type, names interface{}) { lines = append(lines, fmt.Sprintf("%s %s", names, T)) }) sort.Strings(lines) for _, line := range lines { fmt.Println(line) } // Output: // [X Y] []string // [f g] func(offset int32) (value byte, ok bool) // [p q] untyped float }