cari

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
}

Memulakan Struktur

Struktur boleh dimulakan dalam pelbagai cara.

Memulakan dengan Nama Medan

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

Memulakan dengan Nilai Lalai

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

user2 := User{
  Username: "bob",
}

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",
}

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)
}

Penerima Penunjuk

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

func (u *User) UpdateEmail(newEmail string) {
  u.Email = newEmail
}

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()
}

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
}

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,
}

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
}

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,
}

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",
}

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",
}

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)
}

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
}

Melaksanakan Struktur Data Set

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

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",
}

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!

Kenyataan
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
Golang vs Python: Kebaikan dan KekejanganGolang vs Python: Kebaikan dan KekejanganApr 21, 2025 am 12:17 AM

Golangisidealforbuildingscalablesystemsduetoitseficiencyandcurrency, whilepythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.golang'sdesignencouragescouragescouragescouragescourageSlean, readablecodeanditsouragescouragescourscean,

Golang dan C: Konvensyen vs kelajuan mentahGolang dan C: Konvensyen vs kelajuan mentahApr 21, 2025 am 12:16 AM

Golang lebih baik daripada C dalam kesesuaian, manakala C lebih baik daripada Golang dalam kelajuan mentah. 1) Golang mencapai kesesuaian yang cekap melalui goroutine dan saluran, yang sesuai untuk mengendalikan sejumlah besar tugas serentak. 2) C Melalui pengoptimuman pengkompil dan perpustakaan standard, ia menyediakan prestasi tinggi yang dekat dengan perkakasan, sesuai untuk aplikasi yang memerlukan pengoptimuman yang melampau.

Mengapa menggunakan Golang? Faedah dan kelebihan dijelaskanMengapa menggunakan Golang? Faedah dan kelebihan dijelaskanApr 21, 2025 am 12:15 AM

Sebab -sebab memilih Golang termasuk: 1) prestasi konkurensi tinggi, 2) sistem jenis statik, 3) mekanisme pengumpulan sampah, 4) perpustakaan dan ekosistem standard yang kaya, yang menjadikannya pilihan yang ideal untuk membangunkan perisian yang cekap dan boleh dipercayai.

Golang vs C: Perbandingan Prestasi dan KelajuanGolang vs C: Perbandingan Prestasi dan KelajuanApr 21, 2025 am 12:13 AM

Golang sesuai untuk pembangunan pesat dan senario serentak, dan C sesuai untuk senario di mana prestasi ekstrem dan kawalan peringkat rendah diperlukan. 1) Golang meningkatkan prestasi melalui pengumpulan sampah dan mekanisme konvensional, dan sesuai untuk pembangunan perkhidmatan web yang tinggi. 2) C mencapai prestasi muktamad melalui pengurusan memori manual dan pengoptimuman pengkompil, dan sesuai untuk pembangunan sistem tertanam.

Adakah Golang lebih cepat daripada C? Meneroka hadAdakah Golang lebih cepat daripada C? Meneroka hadApr 20, 2025 am 12:19 AM

Golang melakukan lebih baik dalam masa penyusunan dan pemprosesan serentak, sementara C mempunyai lebih banyak kelebihan dalam menjalankan kelajuan dan pengurusan ingatan. 1. Golang mempunyai kelajuan kompilasi yang cepat dan sesuai untuk pembangunan pesat. 2.C berjalan pantas dan sesuai untuk aplikasi kritikal prestasi. 3. Golang adalah mudah dan cekap dalam pemprosesan serentak, sesuai untuk pengaturcaraan serentak. 4.C Pengurusan memori manual memberikan prestasi yang lebih tinggi, tetapi meningkatkan kerumitan pembangunan.

Golang: Dari perkhidmatan web ke pengaturcaraan sistemGolang: Dari perkhidmatan web ke pengaturcaraan sistemApr 20, 2025 am 12:18 AM

Aplikasi Golang dalam perkhidmatan web dan pengaturcaraan sistem terutamanya ditunjukkan dalam kesederhanaan, kecekapan dan kesesuaiannya. 1) Dalam perkhidmatan web, Golang menyokong penciptaan aplikasi web berprestasi tinggi dan API melalui perpustakaan HTTP yang kuat dan keupayaan pemprosesan serentak. 2) Dalam pengaturcaraan sistem, Golang menggunakan ciri -ciri yang berdekatan dengan perkakasan dan keserasian dengan bahasa C sesuai untuk pembangunan sistem operasi dan sistem tertanam.

Golang vs C: Penanda aras dan prestasi dunia nyataGolang vs C: Penanda aras dan prestasi dunia nyataApr 20, 2025 am 12:18 AM

Golang dan C mempunyai kelebihan dan kekurangan mereka sendiri dalam perbandingan prestasi: 1. Golang sesuai untuk perselisihan yang tinggi dan perkembangan pesat, tetapi pengumpulan sampah boleh menjejaskan prestasi; 2.C menyediakan prestasi yang lebih tinggi dan kawalan perkakasan, tetapi mempunyai kerumitan pembangunan yang tinggi. Apabila membuat pilihan, anda perlu mempertimbangkan keperluan projek dan kemahiran pasukan dengan cara yang komprehensif.

Golang vs Python: Analisis PerbandinganGolang vs Python: Analisis PerbandinganApr 20, 2025 am 12:17 AM

Golang sesuai untuk senario pengaturcaraan berprestasi tinggi dan serentak, manakala Python sesuai untuk pembangunan pesat dan pemprosesan data. 1.Golang menekankan kesederhanaan dan kecekapan, dan sesuai untuk perkhidmatan back-end dan microservices. 2. Python terkenal dengan sintaks ringkas dan perpustakaan yang kaya, sesuai untuk sains data dan pembelajaran mesin.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)