Visitar URL original
reflect: clarify behavior for unexported names · Issue #4876 · golang/go · GitHub
Skip to content

reflect: clarify behavior for unexported names #4876

Closed

Description

@adonovan
Exported field names inhabit a global namespace but unexported (lower case) field names
belong to the namespace of the package in which they lexically appear.

The "reflect" API doesn't mention this, which can lead to surprising results
when searching for a lowercase field by name.

   func (v Value) FieldByName(name string) Value
   FieldByName returns the struct field with the given name.
   It returns the zero Value if no field was found.
   It panics if v's Kind is not struct.

In the example below, a struct has two fields, both called r, but belonging to different
namespaces.  The "reflect" algorithm, when searching for "r", finds
both, and assumes there's a conflict when in reality there isn't.  Without changing the
existing API, that's the best we can do, but it would be useful to document this because
otherwise the choice of unexported field names inside one package can have subtle
effects on another package using reflection.

http://play.golang.org/p/WTj5d06CQ3

(gri: I know you know all this already.)

Activity

  1. adonovan commented on Feb 22, 2013

    @adonovan
    MemberAuthor

    Comment 1:

    (gri -> rsc)

    Owner changed to @rsc.

  2. rsc commented on Feb 22, 2013

    @rsc
    Contributor

    Comment 2:

    It's tempting to just remove support for lower case names from FieldByName.
    The current behavior is arguably incorrect.
  3. adonovan commented on Feb 22, 2013

    @adonovan
    MemberAuthor

    Comment 3:

    Perhaps the most correct solution is to add another method:
     // Precondition: !ast.IsExported(fieldname) <=> pkgpath != ""
     FieldFieldByQualifiedName(pkgpath, fieldname string)
    which also compares the StructField.PkgPath, not just the name.
    The first method could be changed in one of the following ways:
    (a) document its tricky behaviour but remain unchanged.
    (b) reject lowercase field names.
    (b) accept lowercase field names, and in that case reflect over the callstack (!) and
    extract the default package name from the calling frame, and then pass that to the
    qualified 2-arg function.
  4. rsc commented on Mar 12, 2013

    @rsc
    Contributor

    Comment 4:

    Leaving for Go 1.2. Not important enough.

    Labels changed: added priority-later, go1.2, removed priority-triage, go1.1maybe.

  5. rsc commented on Sep 10, 2013

    @rsc
    Contributor

    Comment 5:

    Labels changed: added documentation.

  6. rsc commented on Sep 13, 2013

    @rsc
    Contributor

    Comment 6:

    This issue was closed by revision 7fb3d8e.

    Status changed to Fixed.

  7. added this to the Go1.2 milestone on Apr 14, 2015
  8. locked and limited conversation to collaborators on Jun 24, 2016
  9. removed their assignment
    on Jun 22, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions