Structuri înlănțuite
Câmpurile unor structuri pot reprezenta alte structuri. De exemplu:
package main
import "fmt"
type contact struct{
email string
phone string
}
type person struct{
name string
age int
contactInfo contact
}
func main() {
var tom = person {
name: "Tom",
age: 24,
contactInfo: contact{
email: "tom@gmail.com",
phone: "+1234567899",
},
}
tom.contactInfo.email = "supertom@gmail.com"
fmt.Println(tom.contactInfo.email) // supertom@gmail.com
fmt.Println(tom.contactInfo.phone) // +1234567899
}
În acest caz, structura person are un câmp contactInfo, care reprezintă o altă structură contact.
Definirea câmpului poate fi prescurtată astfel:
package main
import "fmt"
type contact struct{
email string
phone string
}
type person struct{
name string
age int
contact
}
func main() {
var tom = person {
name: "Tom",
age: 24,
contact: contact{
email: "tom@gmail.com",
phone: "+1234567899",
},
}
tom.email = "supertom@gmail.com"
fmt.Println(tom.email) // supertom@gmail.com
fmt.Println(tom.phone) // +1234567899
}
Câmpul contact din structura person este echivalent cu proprietatea contact din structura contact, adică proprietatea se numește contact și reprezintă tipul contact. Acest lucru ne permite să prescurtăm accesul la câmpurile structurii înlănțuite. De exemplu, putem scrie tom.email, nu tom.contact.email. Totuși, putem utiliza și a doua variantă.
Stocarea unei referințe către o structură de același tip
Trebuie să ținem cont că o structură nu poate avea un câmp care reprezintă tipul aceleași structuri. De exemplu:
type node struct{
value int
next node
}
Această definiție este incorectă. În schimb, câmpul ar trebui să reprezinte un pointer către structură:
package main
import "fmt"
type node struct{
value int
next *node
}
// afișarea recursivă a listei
func printNodeValue(n *node){
fmt.Println(n.value)
if n.next != nil{
printNodeValue(n.next)
}
}
func main() {
first := node{value: 4}
second := node{value: 5}
third := node{value: 6}
first.next = &second
second.next = &third
var current *node = &first
for current != nil{
fmt.Println(current.value)
current = current.next
}
}
Aici este definită structura node, care reprezintă un nod tipic al unei liste înlănțuite simple. Aceasta stochează valoarea în câmpul value și o referință către următorul nod prin pointerul next.
În funcția main, sunt create trei structuri înlănțuite, iar cu ajutorul unui ciclu for și al unui pointer auxiliar current, se afișează valorile acestora.
Ieșirea va fi:
4
5
6