It not being condescending. Your code is not correct. It is not an eventID - it is an index (an int). Slice indexes are ints. If you want a typed key (other than int) you need a map (or variant).
> On Feb 2, 2020, at 8:17 PM, Steve Roth <st...@rothskeller.net> wrote: > > > Oh, please, Robert. No need to be condescending. I know perfectly well how > to use the value when that's what I want. Often it is not. The examples > that I cited are such a case: we are adding the IDs of the events — the > indices of the slice — to the person.Events field. If you don't like my > example, take a look through the standard library code: you'll find a great > many instances of range loops using only the index. > > Regards, > Steve > > >> On Sun, Feb 2, 2020 at 5:56 PM Robert Engels <reng...@ix.netcom.com> wrote: >> You are using range incorrectly - you are using the index not the value. >> >> See https://tour.golang.org/moretypes/16 >> >>>> On Feb 2, 2020, at 7:39 PM, Steve Roth <st...@rothskeller.net> wrote: >>>> >>> >>> Greetings, >>> >>> I'm considering submitting a proposal for a language change, and would like >>> some informal feedback on the idea before engaging the formal process. The >>> idea being proposed here is intended to improve type safety by removing the >>> need for some error-prone type casting. It is a backward compatible change. >>> >>> Consider a body of code that works with people and events. Both are >>> identified with integer IDs; in order to prevent them being used in the >>> wrong contexts, they are given specific integer types: >>> type EventID int >>> type PersonID int >>> Assume also that people have lists of events they attend: >>> type Person struct { >>> Events []EventID >>> } >>> The code maintains slices of each type: >>> var events []*Event >>> var people []*Person >>> When indexing into those slices, one can use the appropriate ID type: >>> var eventID EventID = 3 >>> println(events[eventID]) >>> However, iterating over these slices requires casting in the current Go >>> specification: >>> for eventID := range events { >>> // eventID here has type int, not type EventID >>> person.Events = append(person.Events, eventID) // compile error, wrong type >>> person.Events = append(person.Events, EventID(eventID)) // cast required >>> } >>> In cases where the event ID needs to be used inside the loop, it has lost >>> its type safety. It has to be casted back to the type it is supposed to >>> have. And that casting is error-prone; I could easily cast it to PersonID >>> by mistake. This seems to be a noteworthy gap in type safety. >>> >>> My proposal is to allow this construction: >>> var eventID EventID >>> for eventID = range events { >>> // eventID here has type EventID >>> person.Events = append(person.Events, eventID) // accepted by compiler >>> } >>> Phrased more formally: a slice range operator can be assigned to a variable >>> of any integer-derived type, not just "int". If this were done, >>> error-prone casting could be avoided. >>> >>> Admittedly, there is still room for error here, since it would be possible >>> to write >>> var eventID PersonID >>> for eventID = range events { >>> // eventID here has the wrong type PersonID >>> person.Events = append(person.Events, eventID) // compile error, wrong type >>> } >>> However, this error seems far less likely that a mistaken cast. And since >>> there's no expectation that casts should be needed, the compiler error >>> would cause greater scrutiny leading to fixing the real problem. (In any >>> case, I don't wish to propose the (much larger and more impactful) change >>> of having slices with typed indices.) >>> >>> I believe this proposal would significantly improve type safety in programs >>> that work with multiple integer-derived types (such as most anything >>> working with a relational database that prefers integer primary keys). I >>> also believe it is backward compatible since it does not change the >>> semantic of any existing code; it just adds a semantic to code that >>> currently would not compile. >>> >>> I solicit the community's feedback. Should this proposal be formally >>> submitted? >>> >>> Regards, >>> Steve >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to golang-nuts+unsubscr...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/CAAnpqKHS%3D2z0ZbNVSrULXLLGz%3DhAqpmrsLieciFu8L6%3DAn%3DLHA%40mail.gmail.com. > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/CAAnpqKEEOPicjwD%3Dmy08ORMzOwFiMFy4F%3DG3L9bdLFfbbsnHWA%40mail.gmail.com. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/BE40614F-17E0-42BE-9B5F-7C854004412B%40ix.netcom.com.