Rumah > pembangunan bahagian belakang > Golang > Menyelam dalam Go Struct

Menyelam dalam Go Struct

Linda Hamilton
Lepaskan: 2025-01-04 05:02:40
asal
426 orang telah melayarinya

Dalam Go, struct ialah jenis agregat yang digunakan untuk mentakrif dan merangkum data. Ia membolehkan menggabungkan bidang pelbagai jenis. Structs boleh dilihat sebagai jenis data tersuai yang serupa dengan kelas dalam bahasa lain, tetapi ia tidak menyokong warisan. Kaedah ialah fungsi yang dikaitkan dengan jenis tertentu (selalunya struct) dan boleh dipanggil menggunakan tika jenis itu.

Mentakrif dan Memulakan Struktur

Mentakrifkan Struktur

Struktur ditakrifkan menggunakan kata kunci jenis dan struktur. Berikut ialah contoh definisi struktur mudah:

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Memulakan Struktur

Struktur boleh dimulakan dalam pelbagai cara.

Memulakan dengan Nama Medan

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Memulakan dengan Nilai Lalai

Jika sesetengah medan tidak dinyatakan, ia dimulakan kepada nilai sifarnya untuk jenis masing-masing.

user2 := User{
  Username: "bob",
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam contoh ini, E-mel akan dimulakan kepada rentetan kosong (""), SignInCount kepada 0 dan IsActive kepada false.

Memulakan dengan Penunjuk

Struktur juga boleh dimulakan menggunakan penunjuk.

user3 := &User{
  Username: "charlie",
  Email:    "charlie@example.com",
}
Salin selepas log masuk
Salin selepas log masuk

Kaedah dan Tingkah Laku Struktur

Dalam Go, struct bukan sahaja untuk menyimpan data tetapi juga boleh mempunyai kaedah yang ditentukan untuknya. Ini membolehkan struct untuk merangkum tingkah laku yang berkaitan dengan data mereka. Di bawah ialah penjelasan terperinci tentang kaedah dan tingkah laku struct.

Menentukan Kaedah untuk Struktur

Kaedah ditakrifkan menggunakan penerima, yang merupakan parameter pertama kaedah dan menentukan jenis kaedah tersebut. Penerima boleh sama ada penerima nilai atau penerima penunjuk.

Penerima Nilai

Penerima nilai mencipta salinan struct apabila kaedah dipanggil, jadi pengubahsuaian pada medan tidak menjejaskan struct asal.

type User struct {
  Username string
  Email    string
}

func (u User) PrintInfo() {
  fmt.Printf("Username: %s, Email: %s\n", u.Username, u.Email)
}
Salin selepas log masuk
Salin selepas log masuk

Penerima Penunjuk

Penerima penunjuk membenarkan kaedah untuk mengubah suai medan struct asal secara langsung.

func (u *User) UpdateEmail(newEmail string) {
  u.Email = newEmail
}
Salin selepas log masuk

Set Kaedah

Dalam Go, semua kaedah struct membentuk set kaedahnya. Kaedah yang ditetapkan untuk penerima nilai merangkumi semua kaedah dengan penerima nilai, manakala kaedah yang ditetapkan untuk penerima penunjuk merangkumi semua kaedah dengan kedua-dua penunjuk dan penerima nilai.

Antara Muka dan Kaedah Struktur

Kaedah struktur sering digunakan dengan antara muka untuk mencapai polimorfisme. Apabila mentakrifkan antara muka, anda menentukan kaedah yang mesti dilaksanakan oleh struct.

type UserInfo interface {
  PrintInfo()
}

// User implements the UserInfo interface
func (u User) PrintInfo() {
  fmt.Printf("Username: %s, Email: %s\n", u.Username, u.Email)
}

func ShowInfo(ui UserInfo) {
  ui.PrintInfo()
}
Salin selepas log masuk

Penjajaran Memori dalam Struktur

Dalam Go, penjajaran memori untuk struct direka untuk meningkatkan kecekapan capaian. Jenis data yang berbeza mempunyai keperluan penjajaran khusus dan pengkompil boleh memasukkan bait padding antara medan struct untuk memenuhi keperluan ini.

Apakah Penjajaran Memori?

Penjajaran memori bermakna data dalam ingatan mesti terletak pada alamat yang berbilang nilai tertentu. Saiz jenis data menentukan keperluan penjajarannya. Contohnya, int32 memerlukan penjajaran kepada 4 bait dan int64 memerlukan penjajaran kepada 8 bait.

Mengapa Penjajaran Memori Diperlukan?

Akses memori yang cekap adalah penting untuk prestasi CPU. Jika pembolehubah tidak diselaraskan dengan betul, CPU mungkin memerlukan berbilang akses memori untuk membaca atau menulis data, yang membawa kepada kemerosotan prestasi. Dengan menjajarkan data, pengkompil memastikan capaian memori yang cekap.

Peraturan untuk Penjajaran Memori Struktur

  • Penjajaran medan: Setiap alamat medan mesti memenuhi keperluan penjajaran jenisnya. Pengkompil boleh memasukkan bait padding antara medan untuk memastikan penjajaran yang betul.
  • Penjajaran struktur: Saiz struct mestilah gandaan daripada keperluan penjajaran terbesar antara medannya.

Contoh:

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Output: 12

Analisis:

  • a ialah int8, menduduki 1 bait, sejajar dengan 1.
  • b ialah int32, memerlukan penjajaran kepada 4 bait. Pengkompil memasukkan 3 bait padding antara a dan b untuk menjajarkan alamat b kepada 4.
  • c ialah int8, memerlukan 1 bait, tetapi jumlah saiz struct mestilah gandaan 4 (keperluan penjajaran terbesar). Pengkompil menambah 3 bait padding pada penghujungnya.

Mengoptimumkan Penjajaran Memori

Anda boleh menyusun semula medan struct untuk meminimumkan padding dan mengurangkan penggunaan memori.

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Output: 8

Dalam versi yang dioptimumkan ini, b diletakkan dahulu, menjajarkannya kepada 4 bait. a dan c diletakkan berturut-turut, menjadikan jumlah saiz 8 bait, yang lebih padat daripada versi yang tidak dioptimumkan.

Ringkasan

  • Medan struktur dalam Go diperuntukkan memori berdasarkan keperluan penjajarannya, dengan potensi bait padding.
  • Melaraskan susunan medan boleh meminimumkan padding dan mengoptimumkan penggunaan memori.
  • Gunakan tidak selamat.Sizeof untuk menentukan saiz memori sebenar sesuatu struct.

Struktur dan Komposisi Bersarang

Dalam Go, struktur dan komposisi bersarang ialah alat yang berkuasa untuk penggunaan semula kod dan mengatur data yang kompleks. Struk bersarang membenarkan struct memasukkan struct lain sebagai medan, membolehkan penciptaan model data yang kompleks. Komposisi, sebaliknya, mencipta struct baharu dengan memasukkan struct lain, memudahkan penggunaan semula kod.

Struktur Bersarang

Struktur bersarang membolehkan satu struct memasukkan struct lain sebagai medan. Ini menjadikan struktur data lebih fleksibel dan teratur. Berikut ialah contoh struct bersarang:

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Komposisi Struktur

Komposisi membenarkan berbilang struct digabungkan menjadi struct baharu, membolehkan penggunaan semula kod. Dalam komposisi, struct boleh memasukkan berbilang struct lain sebagai medan. Ini membantu membina model yang lebih kompleks dan berkongsi medan atau kaedah yang sama. Berikut ialah contoh komposisi struct:

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Perbezaan Antara Struktur Bersarang dan Komposisi

  • Struktur Bersarang: Digunakan untuk menggabungkan struct bersama-sama, dengan jenis medan dalam satu struct ialah satu lagi struct. Pendekatan ini sering digunakan untuk menerangkan model data dengan perhubungan hierarki.
  • Komposisi: Membenarkan struct memasukkan medan daripada berbilang struct lain. Kaedah ini digunakan untuk mencapai penggunaan semula kod, membolehkan struct mempunyai gelagat dan atribut yang lebih kompleks.

Ringkasan

Struktur dan komposisi bersarang ialah ciri berkuasa dalam Go yang membantu mengatur dan mengurus struktur data yang kompleks. Apabila mereka bentuk model data, menggunakan struktur dan gubahan bersarang dengan sewajarnya boleh menjadikan kod anda lebih jelas dan lebih boleh diselenggara.

Struktur Kosong

Struktur kosong dalam Go ialah struct tanpa medan.

Saiz dan Alamat Memori

Struktur kosong menduduki sifar bait memori. Walau bagaimanapun, alamat ingatannya mungkin sama atau mungkin tidak sama dalam keadaan yang berbeza. Apabila pelarian memori berlaku, alamat adalah sama, menunjuk ke runtime.zerobase.

user2 := User{
  Username: "bob",
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Daripada output, pembolehubah a, b dan zerobase berkongsi alamat yang sama, semuanya menunjuk kepada pembolehubah global runtime.zerobase (runtime/malloc.go).

Mengenai senario melarikan diri:

  • Pembolehubah c dan d melarikan diri ke timbunan. Alamat mereka ialah 0x590d00, dan mereka membandingkan sama (benar).
  • Pembolehubah e dan f mempunyai alamat yang berbeza (0xc00008ef47) dan bandingkan tidak sama (salah).

Tingkah laku ini disengajakan dalam Go. Apabila pembolehubah struct kosong tidak terlepas, penunjuknya adalah tidak sama. Selepas melarikan diri, penunjuk menjadi sama.

Pengiraan Ruang Apabila Membenamkan Struktur Kosong

Struktur kosong itu sendiri tidak menduduki ruang, tetapi apabila dibenamkan dalam struktur lain, ia mungkin menggunakan ruang bergantung pada kedudukannya:

  • Apabila ia adalah satu-satunya medan dalam struct, struct tidak menduduki ruang.
  • Apabila ia adalah medan pertama atau pertengahan, ia tidak menempati ruang.
  • Apabila ia adalah medan terakhir, ia menduduki ruang yang sama dengan medan sebelumnya.
user3 := &User{
  Username: "charlie",
  Email:    "charlie@example.com",
}
Salin selepas log masuk
Salin selepas log masuk

Apabila struct kosong ialah elemen tatasusunan atau kepingan:

type User struct {
  Username string
  Email    string
}

func (u User) PrintInfo() {
  fmt.Printf("Username: %s, Email: %s\n", u.Username, u.Email)
}
Salin selepas log masuk
Salin selepas log masuk

Aplikasi

Sifat bersaiz sifar bagi struct kosong membolehkannya digunakan untuk pelbagai tujuan tanpa overhed memori tambahan.

Cegah Permulaan Struktur Tidak Berkunci

type User struct {
  Username    string
  Email       string
  SignInCount int
  IsActive    bool
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Melaksanakan Struktur Data Set

user1 := User{
  Username:    "alice",
  Email:       "alice@example.com",
  SignInCount: 1,
  IsActive:    true,
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penghantaran Isyarat melalui Saluran

Kadangkala, kandungan data yang dihantar melalui saluran tidak relevan, hanya berfungsi sebagai isyarat. Sebagai contoh, struct kosong boleh digunakan dalam pelaksanaan semaphore:

user2 := User{
  Username: "bob",
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kami adalah Leapcell, pilihan utama anda untuk menggunakan projek Go ke awan.

Deep Dive into Go Struct

Leapcell ialah Platform Tanpa Pelayan Generasi Seterusnya untuk Pengehosan Web, Tugas Async dan Redis:

  1. Sokongan Berbilang Bahasa
  • Bangun dengan JavaScript, Python, Go atau Rust.
  1. Kerahkan projek tanpa had secara percuma
  • bayar hanya untuk penggunaan — tiada permintaan, tiada caj.
  1. Kecekapan Kos yang tiada tandingan
  • Bayar semasa anda pergi tanpa caj terbiar.
  • Contoh: $25 menyokong 6.94 juta permintaan pada purata masa tindak balas 60ms.
  1. Pengalaman Pembangun Diperkemas
  • UI intuitif untuk persediaan yang mudah.
  • Saluran paip CI/CD automatik sepenuhnya dan penyepaduan GitOps.
  • Metrik masa nyata dan pengelogan untuk mendapatkan cerapan yang boleh diambil tindakan.
  1. Skala Mudah dan Prestasi Tinggi
  • Penskalaan automatik untuk mengendalikan konkurensi tinggi dengan mudah.
  • Sifar operasi overhed — hanya fokus pada pembinaan.

Terokai lagi dalam Dokumentasi!

Ikuti kami di X: @LeapcellHQ


Baca di blog kami

Atas ialah kandungan terperinci Menyelam dalam Go Struct. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan