2016-04-02 12 views
0

Aşağıdaki kod var:Git: bir yapının içinde bir dilim bildiriliyor mu?

type room struct { 
    width float32 
    length float32 
} 
type house struct{ 
    s := make([]string, 3) 
    name string 
    roomSzSlice := make([]room, 3) 
} 

func main() { 


} 

Ve kurmak ve çalıştırmak denediğinizde i aşağıdaki hataları olsun:

c:\go\src\test\main.go:10: syntax error: unexpected := 
c:\go\src\test\main.go:11: non-declaration statement outside function body 
c:\go\src\test\main.go:12: non-declaration statement outside function body 
c:\go\src\test\main.go:13: syntax error: unexpected } 

ben yanlış ne yaptın

?

Teşekkürler!

+0

sadece diğer alanlar gibi bildirin. "s [] dizgisi" bu durumda; Hata oldukça net bir şekilde size neyin yanlış olduğunu söyler. – Snowman

+0

Teşekkürler, ama söylediğiniz gibi bildirirseniz, bir dilim bildirimi ve dizi bildirimi arasındaki fark nedir? – Gambit2007

+0

tek şey, bir dizinin * tipinin * bir kısmının uzunluk olmasıdır, bu nedenle 3 öğeden oluşan bir dizi 4 öğeden oluşan bir dizi ile aynı türde değildir, bu nedenle var n [3] int gibi bir dizi bildirirseniz daha sonra yazdığınız aynı bağlamda dilimle birlikte 3 inçlik bir diziniz var: var [] int, uzunluğunu vermeden. Sadece diziler hakkında endişelenmeyin demek istiyorum; Gerçekten de neredeyse tüm durumlarda bize doğrudan yararlı değildirler. – Snowman

cevap

0

Öncelikle size yapı içine başlatmak/atayamıyoruz, bir runnable example on Go Playground yukarıdaki bakınız. : = Operatör bildirir ve atar. Ancak, aynı sonucu basitçe elde edebilirsiniz. İşte

sen çalıştığın şey kabaca yapacağını basit, önemsiz örnektir: Ben tek yön yazmadım

type house struct { 
    s []string 
} 

func main() { 
    h := house{} 
    a := make([]string, 3) 
    h.s = a 
} 

, ancak sunucuları amacınız eğer ... yine derler.

4

öğesinin bir bildirim bildiriminde bir dilim belirtebilirsiniz, ancak bunu başlatamazsınız. Bunu farklı yollarla yapmalısınız.

// Keep in mind that lowercase identifiers are 
// not exported and hence are inaccessible 
type House struct { 
    s []string 
    name string 
    rooms []room 
} 

// So you need accessors or getters as below, for example 
func(h *House) Rooms()[]room{ 
    return h.rooms 
} 

// Since your fields are inaccessible, 
// you need to create a "constructor" 
func NewHouse(name string) *House{ 
    return &House{ 
     name: name, 
     s: make([]string, 3), 
     rooms: make([]room, 3), 
    } 
} 

biri basitçe değiştirebilir, yorum istendiği gibi

, kısmen yapı başlatılamadı bir runnable example on Go Playground


DÜZENLEME yukarıdaki bakınız

func NewHouse(name string) *House{ 
    return &House{ 
     name: name, 
    } 
} 

tekrar

+0

Teşekkürler, ancak dilimi ilklendirmek istemiyorsam (anlamı - içindeki eleman sayısını belirtmek istemiyorum), nasıl yaparım? – Gambit2007

+0

Sadece in: make ([] string) 'gibi make içindeki sayıyı kaldırın. [tour.golang.org] (http://tour.golang.org) ve [Etkili Go] (https://golang.org/doc/effective_go.html) mutlaka okunması iyi bir fikir olabilir. ikinci veya üçüncü kez olsa bile, incitmez. Çalışmayacak olan –

+1

@MarkusWMahlberg - dilim uzunluğu, 'make' argümanı olarak gereklidir. @ Gambit2007 - Eğer onu başlatmak istemiyorsanız, sadece sıfır değeri olarak bırakın (başlatma işlemini tamamen kaldırın). Nil olacaktır ve 0 uzunluğunda olacaktır. İsterseniz daha sonra başlatabilirsiniz. – joshlf

İlgili konular