Jika menurut Anda kode ini idiomatis, elegan, dan indah, baca artikel ini!
FindProcess(ByTitle(title))
FindProcess(ByPID(pid))
Kode ini merupakan contoh hasil pola predikat. Contoh ini sintetis, namun di sini kami mencoba mencapai hasil serupa di sini. Pertama, mari kita cari tahu predikatnya. Predikat adalah sebuah fungsi, yang mengembalikan nilai boolean — sangat sederhana!
Sekarang, misalnya, kita akan menulis sebuah metode findProcess untuk ProcManager on Go dengan pola predikat. Itu ProcManager memiliki lapangan processes []*Processyang merupakan bagian dari proses. Dan itu Process memiliki banyak field unik, yang dapat kita gunakan untuk mencari. Metode kami akan mengambil a predikat dan menerapkannya ke semua item dalam daftar hingga predikatnya kembali trueatau daftar berakhir dan pencarian kembali hmm... nothing was found.
Misalnya, di Python kita memiliki fungsi standar filteryang mengambil array item dan fungsi predikat, seperti ini:
filter([1, 2, 3, 4, 5], lambda n: n % 2 == 0)
Namun disini kita perlu menangani predikat secara manual, karena ini adalah fungsi yang lebih umum. Untuk kasus kami, kami menambahkan langkah perantara: pembuat predikat. Akhirnya kita akan mendapatkan skema ini:
Mari kita menulis sebuah metode findProcess:
func (pm *ProcManager) findProcess(searchPredicate ProcessSearchPredicate) (*Process, error) {
pm.mu.RLock()
defer pm.mu.RUnlock()
for _, proc := range pm.processes {
if searchPredicate(proc) {
return proc, nil
}
}
return nil, fmt.Errorf("no process with this parameter")
}
Metode ini membutuhkan satu argumen: searchPredicate dengan tipe tertentu ProcessSearchPreciate:
type ProcessSearchPredicate func(p *Process) bool
Mari kita lihat: fungsinya dari Process ke bool — sebuah predikat. Kemudian kita dapat menulis fungsi pembuat predikat, seperti opsi filter:
func ByTitle(title string) ProcessSearchPredicate {
return func(p *Process) bool {
return p.Title == title
}
}
func ByPID(pid int) ProcessSearchPredicate {
return func(p *Process) bool {
return p.PID == pid
}
}
Ini akan bekerja seperti ini:
proc, err := pm.findProcess(ByTitle(title))
Ini sudah bagus, tapi saya ingin menggunakan pelengkapan otomatis di editor kode saya untuk opsi filter. Untuk membuatnya kita dapat menulis ulang opsi filter dari fungsi ke metode dan gunakan satu objek kosong untuk memanggilnya, seperti ini:
type ProcessSearchFilter struct{}
var filter = ProcessSearchFilter{}
func (f ProcessSearchFilter) ByTitle(title string) ProcessSearchPredicate {
return func(p *Process) bool {
return p.Title == title
}
}
func (f ProcessSearchFilter) ByPID(pid int) ProcessSearchPredicate {
return func(p *Process) bool {
return p.PID == pid
}
}
Setelah itu kita bisa menggunakan seperti ini:
proc, err := pm.findProcess(filter.ByTitle(title))
Dan alur kerja saya di editor kode saya sangat nyaman:
Jika Anda menyukai tampilan editor kode saya, Anda dapat menggunakan tema Neovim saya: tidak ada. Dan Anda dapat menggunakan konfigurasi nvim saya, temukan di dotfiles saya
Terima kasih telah membaca! Anda dapat membaca artikel asli di blog saya dan berlangganan saluran Telegram



