2013-05-04 160 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

相關問題