Thinking about this over morning coffee it is more complex. It is not just 
sequential consistency that affects it - placing the struct in a map or some 
other reference container would also have to force a copy. 

Less and less utility. 

> On Mar 11, 2020, at 3:33 AM, Robert Engels <reng...@ix.netcom.com> wrote:
> 
> True. But in the current situation, if the object was large, you either do a 
> copy (bad) or use a pointer and synchronize (worse?) - or you have to be 
> sequential. 
> 
> So, const could also carry with it sequential requirements (prohibited to be 
> captured by a Go routine), or alternatively, if captured a copy is made at 
> the time of capture (so you only pay the copy penalty in this case)
> 
> If you need to be concurrent and pass pointers around for performance you 
> need synchronized access anyway - so you are probably adding an access layer 
> anyway. 
> 
> To the OPs point, the “when to use a pointer receiver” in Go has always 
> struck me as a bit “loose” and in the wild many times creates either 
> performance issues or race conditions. Something like this might tighten it 
> up a bit.
> 
> 
> 
>>> On Mar 11, 2020, at 12:20 AM, Ian Lance Taylor <i...@golang.org> wrote:
>>> 
>>> On Tue, Mar 10, 2020 at 10:08 PM robert engels <reng...@ix.netcom.com> 
>>> wrote:
>>> 
>>> I think what the OP was trying to say, is that with ‘const’ the compiler 
>>> could safely use a pointer receiver rather than a copy, and also enforce 
>>> that const are not modified, and only passed as const args (may require a 
>>> heap allocation though, so maybe only if struct is of a certain size based 
>>> on platform/compiler opts).
>>> 
>>> I think he has a point.
>>> 
>>> When you see a ‘pointer receiver’ a developer probably assumes the code 
>>> needs to modify the structs - thus you must pass a pointer. But if you are 
>>> only declaring a pointer to avoid an expensive large structure copy, you 
>>> are giving misleading information - and possibly causing bugs due to 
>>> incorrect later code modifications.
>> 
>> Thanks.  I don't see how to make that work, though.  Consider
>> 
>> type S struct { a [10000]byte }
>> 
>> func (s const S) PrintLater() {
>>   go func() {
>>       time.Sleep(time.Second)
>>       fmt.Printf("%s\n", s.a)
>>   }()
>> }
>> 
>> func F() {
>>   var s S
>>   s.a[0] = 'a'
>>   s.PrintLater()
>>   s.a[0] = 'b'
>> }
>> 
>> With a value receiver the behavior is straightforward.  With a pointer
>> receiver this is a race condition.  With a const receiver, what is it?
>> It shouldn't be a race; after all, we've promised that the const
>> receiver won't modify the receiver.  So we have to copy the struct.
>> 
>> Ian
>> 
>>>> On Mar 10, 2020, at 11:56 PM, Ian Lance Taylor <i...@golang.org> wrote:
>>> 
>>> On Tue, Mar 10, 2020 at 9:49 PM 'aaa bbb' via golang-nuts
>>> <golang-nuts@googlegroups.com> wrote:
>>> 
>>> 
>>> I test a code in go tour, and get a nil error at first:
>>> 
>>> 
>>> func say(s string, ch chan int) {
>>> 
>>> for i := 0; i <= 5; i++ {
>>> 
>>> time.Sleep(100 * time.Millisecond)
>>> 
>>> fmt.Println(s)
>>> 
>>> }
>>> 
>>> ch <- 1
>>> 
>>> }
>>> 
>>> 
>>> func main() {
>>> 
>>> 
>>> 
>>> //var ch chan int
>>> 
>>> var ch chan int = make(chan int, 1)
>>> 
>>> 
>>> 
>>> go say("world", ch)
>>> 
>>> fmt.Println("Hello")
>>> 
>>> <-ch
>>> 
>>> }
>>> 
>>> null reference error almost exists in every programming language.
>>> so why not make directive that indicates a parameter is not allowed nil? 
>>> like
>>> 
>>> func say(s string, ch chan int not nil) {...}
>>> 
>>> Or other more powerful validation mechanism.
>>> 
>>> 
>>> These kinds of issues have been discussed before.  See, for example,
>>> https://golang.org/issue/30177.
>>> 
>>> 
>>> also, at the value receiver and pointer receiver section, sometimes we 
>>> should use pointer
>>> receiver to avoid big memory copy. This is not a good solution, maybe there 
>>> should be a
>>> const keyword that stop modification the big struct and avoid big copy.
>>> 
>>> 
>>> People already have a way to avoid a big memory copy: use a pointer
>>> receiver.  It doesn't seem necessary to have a second way.
>>> 
>>> Ian
>>> 
>>> --
>>> 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/CAOyqgcXrdGyYuUvymVyPyrpUujPr5Z0%2B3cxV6tz%3DmRZkHVLisg%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/C0AED78A-1473-44F5-B3F4-0015DB7608C2%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/13421710-A7C7-4D02-B28C-CA000759763D%40ix.netcom.com.

Reply via email to