MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

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