There are also some changes in there for Go 1.18, specifically the addition of some types, so that only atomic operations can be done: https://pkg.go.dev/sync/atomic@master
Yes but the syntax is confusing, e.g. the code below fails: package main import ( "fmt" "sync/atomic" ) var a atomic.Int32 func main() { fmt.Println(&a.Load()) } although the manual says: type Int32 <https://cs.opensource.google/go/go/+/master:src/sync/atomic/type.go;l=59> ¶ <https://pkg.go.dev/sync/atomic@master#Int32> type Int32 struct { // contains filtered or unexported fields } An Int32 is an atomic int32. The zero value is zero. func (*Int32) Load <https://cs.opensource.google/go/go/+/master:src/sync/atomic/type.go;l=65> ¶ <https://pkg.go.dev/sync/atomic@master#Int32.Load> func (x *Int32 <https://pkg.go.dev/sync/atomic@master#Int32>) Load() int32 <https://pkg.go.dev/builtin#int32> Load atomically loads and returns the value stored in x. That's really essential. For example, using your library, the following code is most definitely *not* race-free: tmp := v.Load() tmp = tmp + 1 v.Save(tmp) Of course not. Neither can misuse of atomic or sync.Map prevent race. I have already shown how simple `=` and `==` caused race on reading occasions in the last post. Strict prevention should have been enforced at the syntax level just like GIL in Python or ownership in Rust, and adding a patch cannot fix loop-holes or side-attacks whatsoever. On Mon, May 23, 2022 at 2:56 PM Axel Wagner <axel.wagner...@googlemail.com> wrote: > Just to be clear, are you aware of the sync/atomic package? > https://pkg.go.dev/sync/atomic > There are also some changes in there for Go 1.18, specifically the > addition of some types, so that only atomic operations can be done: > https://pkg.go.dev/sync/atomic@master > I mention this because atomic.Value and atomic.Pointer[T] are essentially > what you are suggesting here. > > On Mon, May 23, 2022 at 8:04 AM Zhaoxun Yan <yan.zhao...@gmail.com> wrote: > >> However, as I want to narrow the scope of this type down to generate >> integer types (as in the commented code), it encountered two obstacles: >> >> 1) It is not legal to embed a generic inside a struct, nor can it make >> generalized computation =+1 >> >> 2) Inheritance is not available in golang, so type "Counter" cannot >> inherit type "Global" and get its methods automatically. I need to repeat >> Save and Load methods to "Counter". >> >> Am I correct? Or can you improve it? >> > > You are correct that there is no way in Go to write a type which gets all > methods from an embedded field using generics. However, that is a good > thing. For example, say you could write > > type Locked[T any] struct { > sync.Mutex > T > } > > And this would get the methods of T and the methods of sync.Mutex. Then a > user could do > > type Counter int64 > func (c *Counter) Increment() { *c += 1 } > > func main() { > var c Locked[Counter] > go c.Increment() > go c.Increment() > } > > And get a data race. That is, a method can modify a value in a way that is > incompatible with what your wrapper type is trying to do. > > That's really the crux of both of the obstacles you mention. You can't run > arbitrary computations and you can't promote methods, because *not all > computation and not all methods can be made concurrency safe this way*. > > It's best to be intentional about it and explicitly acquire and release a > mutex around the critical sections of your code - because ultimately, only > your code knows which sections are critical. > > >> > -- >> 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/baa74bff-6688-4d39-843b-c99a4fea2d1an%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/baa74bff-6688-4d39-843b-c99a4fea2d1an%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- 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/CADEX6_Undz4th%2BTRCUZUyPZ47tf%2BQzdzF_TzM84EXfp7FPZ3Vw%40mail.gmail.com.