Hook dan Scope
Sesuaikan kueri
Hook dan Scope adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Pengait dan Cakupan
GORM menawarkan dua alat penyesuaian: pengait menjalankan kode secara otomatis di sekitar peristiwa siklus hidup, sedangkan cakupan mengemas logika kueri yang dapat digunakan kembali. Keduanya menjaga akses data tetap rapi dan konsisten.
Apa Itu Pengait
Pengait adalah metode pada model Anda yang dipanggil GORM sebelum atau sesudah suatu operasi: BeforeCreate, AfterCreate, BeforeUpdate, BeforeDelete, dan lainnya.
Pengait BeforeCreate
Tentukan metode dengan tanda tangan yang sesuai pada model. Di sini kita menetapkan UUID sebelum rekaman disisipkan.
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.UUID = uuid.NewString()
return nil
}Validasi dalam Pengait
Kembalikan kesalahan dari pengait untuk membatalkan operasi. GORM membatalkan transaksi yang membungkusnya, sehingga data yang tidak valid tidak pernah sampai ke basis data.
func (u *User) BeforeSave(tx *gorm.DB) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
return nil
}Pengait Berjalan dalam Transaksi
Argumen tx *gorm.DB adalah transaksi yang digunakan GORM. Jika Anda menulis data terkait di dalam pengait, gunakan tx ini agar data tersebut di-Commit atau di-Rollback secara atomik bersama operasi utama.
Apa Itu Cakupan
Cakupan adalah fungsi yang menerima dan mengembalikan *gorm.DB, serta merangkum sebagian kueri. Anda menerapkannya dengan db.Scopes(...) dan dapat menggunakannya kembali pada banyak kueri.
func ActiveUsers(db *gorm.DB) *gorm.DB {
return db.Where("active = ?", true)
}Menerapkan Cakupan
Teruskan satu atau beberapa cakupan ke Scopes. Cakupan tersebut dapat digabungkan, sehingga Anda dapat menggabungkan penyaring secara deklaratif menjadi kueri akhir.
db.Scopes(ActiveUsers, Recent).Find(&users)Simulasi Kait dan Cakupan yang Dapat Dijalankan
GORM memerlukan basis data, sehingga contoh yang dapat dijalankan ini mensimulasikan kait BeforeCreate dan penyaring serupa cakupan yang dapat digunakan kembali dengan fungsi biasa.
package main
import (
"errors"
"fmt"
)
type User struct {
Name string
Age int
Active bool
}
func beforeCreate(u *User) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
if u.Name == "" {
u.Name = "anonymous"
}
return nil
}
func activeOnly(users []User) []User {
var out []User
for _, u := range users {
if u.Active {
out = append(out, u)
}
}
return out
}
func main() {
u := User{Age: 30, Active: true}
if err := beforeCreate(&u); err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("created:", u.Name)
all := []User{u, {Name: "Lin", Active: false}}
fmt.Println("active count:", len(activeOnly(all)))
}Cakupan untuk Paginasi
Cakupan yang umum digunakan menghasilkan paginasi dari nomor halaman, serta merangkum Offset dan Limit agar setiap titik akhir daftar menggunakan paginasi dengan cara yang sama.
func Paginate(page, size int) func(*gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
return db.Offset((page - 1) * size).Limit(size)
}
}Kait vs Logika Aplikasi
Kait memusatkan perhatian lintas fungsi seperti cap waktu, pengenal ringkas, dan bidang audit. Simpan logika bisnis yang berat di layanan, bukan di kait, agar perilaku tetap mudah diprediksi dan diuji.
Melewati Kait
Untuk operasi massal, Anda dapat menonaktifkan kait dengan db.Session(&gorm.Session{SkipHooks: true}). Ini mempercepat impor besar, tetapi melewati validasi Anda, jadi gunakan dengan hati-hati.
Pemeriksaan Singkat
Uji pengetahuan Anda tentang kait dan cakupan.
Ringkasan
Anda telah mempelajari kait dan cakupan:
- Kait berjalan di sekitar peristiwa siklus hidup; pengembalian galat membatalkan operasi dan memutar balik transaksi
- Kait berjalan di dalam transaksi melalui argumen tx
- Cakupan adalah fungsi
*gorm.DByang dapat digunakan kembali dan diterapkan denganScopes - Gunakan cakupan untuk penyaringan dan paginasi
- SkipHooks melewati kait untuk pekerjaan massal
Belajar Go dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Hook dan Scope” gratis?
Ya — teks lengkap “Hook dan Scope” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Hook dan Scope”?
Sesuaikan kueri Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Hook dan Scope” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Model dan AutoMigrate
- Operasi CRUD
- Asosiasi
- Hook dan Scope