One last point, if you are interested in type safety, why not create simple 
structs like EventList to encapsulate the indexing, etc. Trivial and can be 
done today. 

> On Feb 2, 2020, at 8:28 PM, Robert Engels <reng...@ix.netcom.com> wrote:
> 
> 
> Also, what you are asking for I believe is covered by generics. 
> 
>>> 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/75113376-DE42-4B0E-BF0E-456AC8D44418%40ix.netcom.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/E18A42FF-CD44-40CD-84BA-2137F7CAE0CB%40ix.netcom.com.

Reply via email to