Go / Struct үндэс

Struct үндэс

Struct (бүтэц) нь өөрийн тодорхойлсон өгөгдлийн төрөл юм. Хэд хэдэн шинж чанарыг нэг нэгжид нэгтгэхэд ашиглана. Жишээлбэл, хүнийг илэрхийлэхдэ нэр, нас, имэйл гэсэн шинж чанаруудыг нэг Хүн struct-д багтааж болно.

Бусад хэлийн class-тай утга нийлдэг ч Go-д class байхгүй — struct болон method-г хослуулан ашигладаг.

Struct тодорхойлох ба үүсгэх

type болон struct түлхүүр үгийг ашиглан шинэ бүтэц тодорхойлно:

go
package main

import "fmt"

// Хүн гэсэн шинэ төрөл тодорхойлох
type Хүн struct {
    Нэр   string
    Нас   int
    Имэйл string
}

func main() {
    // Struct утга үүсгэх
    хүн1 := Хүн{
        Нэр:   "Болд Бат",
        Нас:   28,
        Имэйл: "bold@example.mn",
    }

    fmt.Println(хүн1)
    fmt.Println("Нэр:", хүн1.Нэр)
    fmt.Println("Нас:", хүн1.Нас)
}

Дэлгэцэнд:

код
{Болд Бат 28 bold@example.mn}
Нэр: Болд Бат
Нас: 28

type Хүн struct { ... } нь шинэ төрөл тодорхойлно. хүн1.Нэр гэж . (цэг) ашиглан шинж чанарт хандана.

Go-д struct-ийн шинж чанарын нэр том үсгээр эхлэх нь тэр шинж чанар package-аас гадна харагдана гэсэн утгатай. Жижиг үсгээр эхэлбэл зөвхөн тухайн package дотор харагдана.

Struct-г функцт дамжуулах

Struct-г функцт дамжуулж, хүлээн авч болно:

go
package main

import "fmt"

type Дүрс struct {
    Өргөн  float64
    Өндөр float64
}

func талбай(д Дүрс) float64 {
    return д.Өргөн * д.Өндөр
}

func периметр(д Дүрс) float64 {
    return 2 * (д.Өргөн + д.Өндөр)
}

func main() {
    өрөө := Дүрс{Өргөн: 5.5, Өндөр: 4.0}

    fmt.Printf("Талбай: %.1f м²
", талбай(өрөө))
    fmt.Printf("Периметр: %.1f м
", периметр(өрөө))
}

Дэлгэцэнд:

код
Талбай: 22.0 м²
Периметр: 19.0 м

Struct-г дамжуулахад хуулбар үүснэ. Хэрэв функц дотор эх struct-г өөрчлөх шаардлагатай бол pointer дамжуулна — энэ тухай дараагийн хичээлд үзнэ.

Struct-г өөрчлөх

Dot notation ашиглан шинж чанарын утгыг өөрчилж болно:

go
package main

import "fmt"

type Тоглогч struct {
    Нэр   string
    Оноо  int
    Түвшин int
}

func main() {
    тоглогч := Тоглогч{
        Нэр:    "Ганбаяр",
        Оноо:   0,
        Түвшин: 1,
    }

    fmt.Printf("Эхлэл: %s — %d оноо, %d түвшин
",
        тоглогч.Нэр, тоглогч.Оноо, тоглогч.Түвшин)

    // Тоглоом ахицаа
    тоглогч.Оноо += 150
    тоглогч.Түвшин = 2

    fmt.Printf("Одоо: %s — %d оноо, %d түвшин
",
        тоглогч.Нэр, тоглогч.Оноо, тоглогч.Түвшин)
}

Дэлгэцэнд:

код
Эхлэл: Ганбаяр — 0 оноо, 1 түвшин
Одоо: Ганбаяр — 150 оноо, 2 түвшин

Struct дотор struct

Struct нь өөр struct агуулж болно — энэ нь нарийн төвөгтэй өгөгдлийг зохион байгуулахад хэрэгтэй:

go
package main

import "fmt"

type Хаяг struct {
    Хот   string
    Дүүрэг string
}

type Ажилтан struct {
    Нэр   string
    Нас   int
    Хаяг  Хаяг // Хаяг struct-г агуулна
}

func main() {
    а := Ажилтан{
        Нэр: "Оюунчимэг",
        Нас: 32,
        Хаяг: Хаяг{
            Хот:    "Улаанбаатар",
            Дүүрэг: "Сүхбаатар",
        },
    }

    fmt.Println(а.Нэр, "—", а.Хаяг.Хот+",", а.Хаяг.Дүүрэг)
}

Дэлгэцэнд:

код
Оюунчимэг — Улаанбаатар, Сүхбаатар

а.Хаяг.Хот гэж гинжлэн хандаж болно. Энэ нь бодит систем дэх өгөгдлийн бүтцийг хэрхэн загварчлахыг харуулж байна.

Дараагийн хичээлд:

Struct method буюу struct дээр тодорхойлсон функцуудыг судална. Method ашигласнаар struct-г object шиг ажиллуулах боломжтой болно.