2013-05-04 159 views
4

有没有更好的方式来分配这个数组的内容,比如自动调用NewThing()构造函数而不是手动构造每个元素?是否可以通过make()来调用结构构造函数?

package main 

import "sync" 

type Thing struct { 
    lock *sync.RWMutex 
    data chan int 
} 

func NewThing() *Thing { 
    return &Thing{ lock: new(sync.RWMutex), data: make(chan int) } 
} 

func main() { 
    n := 10 
    things := make([]*Thing, n) 
    for i := 10; i < n; i++ { 
     things[i] = NewThing() 
    } 
} 

我意识到我分配了一个指针数组,我的其他尝试不成功,数据不是初始化通道。这只是一个人为的例子。

谢谢!

+1

没有,构造不会自动为你调用。只需将您的代码移入另一个接受数量的函数即可。不幸的是,除了默认的零值初始化以外,没有自动初始化语法。 – 2013-05-04 23:59:15

+0

谢谢,我想这是有道理的。数组初始化例程然后是 – missionsix 2013-05-05 00:11:57

+0

另一种方法是使用另一种类型,例如'Things Things [] * Thing',并给它自己的构造函数,并在循环中初始化并返回它。这会让你做'事情:= make(Things,n).Init()'如果你愿意。 – 2013-05-05 00:20:42

回答

0

你可以简单的写:

package main 

import (
    "fmt" 
    "sync" 
) 

type Thing struct { 
    lock *sync.RWMutex 
    data chan int 
} 

func NewThing() *Thing { 
    return &Thing{lock: new(sync.RWMutex), data: make(chan int)} 
} 

func NewThings(n int) []*Thing { 
    things := make([]*Thing, n) 
    for i := range things { 
     things[i] = NewThing() 
    } 
    return things 
} 

func main() { 
    things := NewThings(3) 

    fmt.Println("things: ", len(things)) 
    for _, thing := range things { 
     fmt.Println(thing) 
    } 
} 

输出:

things: 3 
&{0xc200061020 0xc200062000} 
&{0xc200061040 0xc200062060} 
&{0xc200061060 0xc2000620c0} 
+0

谢谢peterSO,这正是斜视建议的。 – missionsix 2013-05-05 03:57:56

相关问题