On Mon, Dec 12, 2016 at 6:11 PM,  <i...@liangsun.org> wrote:
> Consider this case:
>
> package main
>
> import (
> "errors"
> "fmt"
> "sync"
> )
>
> type A struct {
> Lock sync.Mutex
> X    int
> }
>
> type B struct {
> A
> Y int
> }
>
> func newA(x int) (A, error) {
> if x > 0 {
> return A{}, errors.New("x should not be positive")
> }
> return A{X: x}, nil
> }
>
> func newB(x int, y int) (B, error) {
> a, err := newA(x)
> if err != nil {
> return B{}, err
> }
> return B{
> A: a,
> Y: y,
> }, nil
> }
>
> func main() {
> b, err := newB(-1, 3)
> fmt.Println(b.Y)
> fmt.Println(err)
> }
>
>
> Actually, there is no way to avoid struct copy if the struct containing
> mutex is in another struct directly.
>
> Run
> go tool vet test.go
>
> It will reports
>
> test.go:32: literal copies lock value from a: main.A contains sync.Mutex

You write as though you are disagreeing me, but as far as I can tell,
you are not.

Ian

> On Tuesday, December 13, 2016 at 3:16:14 AM UTC+8, Ian Lance Taylor wrote:
>>
>> On Sun, Dec 11, 2016 at 11:48 PM,  <i...@liangsun.org> wrote:
>> >
>> > What about type embedding? If put a sync.Mutex in a struct, that struct
>> > can
>> > not be embedded into another struct, right?
>>
>> That turns out not to be the case.  You can embed that struct in
>> another struct.  But then, of course, you can not simply copy that
>> other struct.
>>
>> > So I guess it's better idea to use structs with pointer to mutex.
>>
>> It depends.
>>
>> 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.
> For more options, visit https://groups.google.com/d/optout.

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to