code: func (i *NodeInfo) NameComponents() []string {
  	var name []string
  	if i.Address != 0 {
  		name = append(name, fmt.Sprintf("%016x", i.Address))
  	}
  	if fun := i.Name; fun != "" {
  		name = append(name, fun)
  	}
  
  	switch {
  	case i.Lineno != 0:
  		// User requested line numbers, provide what we have.
  		name = append(name, fmt.Sprintf("%s:%d", i.File, i.Lineno))
  	case i.File != "":
  		// User requested file name, provide it.
  		name = append(name, i.File)
  	case i.Name != "":
  		// User requested function name. It was already included.
  	case i.Objfile != "":
  		// Only binary name is available
  		name = append(name, "["+filepath.Base(i.Objfile)+"]")
  	default:
  		// Do not leave it empty if there is no information at all.
  		name = append(name, "<unknown>")
  	}
  	return name
  }
docs: // NameComponents returns the components of the printable name to be used for a node.