templat kelas pelaksanaan golang

WBOY
Lepaskan: 2023-05-15 09:05:07
asal
575 orang telah melayarinya

Golang ialah bahasa pengaturcaraan yang pantas, cekap dan boleh dipercayai sesuai untuk membina aplikasi web dan perkhidmatan rangkaian. Ciri yang kaya dan sintaksnya yang ringkas telah menjadikan Golang sangat popular sejak beberapa tahun kebelakangan ini. Di Golang, melaksanakan templat kelas adalah teknik pengaturcaraan biasa. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan templat kelas.

1. Pengenalan
Di Golang, tiada mekanisme pewarisan kelas tradisional. Tetapi terdapat beberapa teknik yang membolehkan kita mencapai ciri yang serupa dengan pengaturcaraan berorientasikan objek. Salah satu helah tersebut ialah melaksanakan templat kelas. Templat kelas ialah jenis templat yang mentakrifkan jenis umum yang boleh digunakan pada jenis konkrit yang berbeza. Sama seperti kelas generik Java atau kelas templat C++. Templat kelas di Golang boleh dilaksanakan menggunakan antara muka.

2. Definisi antara muka
Di Golang, antara muka ialah koleksi kaedah. Sebarang jenis yang melaksanakan semua kaedah dalam antara muka boleh dipanggil jenis pelaksanaan antara muka. Sebagai contoh, yang berikut mentakrifkan jenis antara muka yang mengandungi kaedah yang diisytiharkan sebagai Do():

type Doer interface {
    Do() error
}
Salin selepas log masuk

Antara muka ini mewakili sesuatu yang boleh "melakukan". Operasi "do" dilaksanakan oleh kaedah Do().

3. Kaedah pelaksanaan
Yang berikut akan menggunakan kes khusus untuk menerangkan cara menggunakan Golang untuk melaksanakan templat kelas. Kami akan melaksanakan antara muka Logger, dan sebarang jenis yang melaksanakan antara muka ini boleh digunakan untuk mengeluarkan log.

Pertama, kami mentakrifkan antara muka Logger dan struktur LogEvent:

type Logger interface {
    Log(event LogEvent)
}

type LogEvent struct {
    Level     string
    Message   string
    Timestamp time.Time
}
Salin selepas log masuk

Antara muka ini mentakrifkan kaedah Log(), yang boleh menerima struktur LogEvent dan mengeluarkannya. Struktur ini mewakili peristiwa log, yang mengandungi maklumat seperti tahap, mesej dan cap masa.

Seterusnya, kami melaksanakan antara muka Logger untuk tahap log yang berbeza:

type ConsoleLogger struct {
    Level string
}

func (l ConsoleLogger) Log(event LogEvent) {
    if event.Level == l.Level {
        fmt.Println(event.Timestamp, event.Level, event.Message)
    }
}

type FileLogger struct {
    Level string
    File  *os.File
}

func (l FileLogger) Log(event LogEvent) {
    if event.Level == l.Level {
        l.File.Write([]byte(fmt.Sprintf("%s %s %s 
", event.Timestamp, event.Level, event.Message)))
    }
}
Salin selepas log masuk

Kod di atas melaksanakan dua jenis log: ConsoleLogger dan FileLogger.

ConsoleLogger bermaksud mengeluarkan log ke konsol; Walau bagaimanapun, kod pelaksanaan untuk kedua-dua jenis mempunyai persamaan. Oleh itu, kita boleh mengabstrakkan kod ini ke dalam templat kelas untuk mencapai penggunaan semula kod.

4. Pelaksanaan templat kelas
Kami akan mentakrifkan templat kelas untuk mengabstrakkan ciri umum Logger Templat ditakrifkan seperti berikut:

type AbstractLogger struct {
    Level string
}

func (l AbstractLogger) Log(event LogEvent) {
    if event.Level == l.Level {
        l.Process(event)
    }
}

func (l AbstractLogger) Process(event LogEvent) {
    panic("Not implemented")
}
Salin selepas log masuk

Ia mentakrifkan Logger abstrak. struktur, Ia mengandungi kaedah Log() dan kaedah Proses() yang sangat biasa. Kaedah Log() ialah kaedah biasa yang mesti dilaksanakan oleh semua orang, manakala kaedah Proses() memerlukan subkelas untuk melaksanakan kaedah tertentu.

Kita boleh mewarisi AbstractLogger dan kemudian mengatasi kaedah Process() untuk melaksanakan kaedah output log tertentu:

type ConsoleLogger struct {
    AbstractLogger
}

func (l ConsoleLogger) Process(event LogEvent) {
    fmt.Println(event.Timestamp, event.Level, event.Message)
}

type FileLogger struct {
    AbstractLogger
    File *os.File
}

func (l FileLogger) Process(event LogEvent) {
    l.File.Write([]byte(fmt.Sprintf("%s %s %s 
", event.Timestamp, event.Level, event.Message)))
}
Salin selepas log masuk

Akhir sekali, kita boleh mencipta contoh Logger dan menggunakan kod untuk mengeluarkan log:

func main() {
    file, _ := os.Create("app.log")
    defer file.Close()

    logger := ConsoleLogger{AbstractLogger{"info"}}
    logger.Log(LogEvent{"debug", "debug message", time.Now()}) // 该条日志不会被输出
    logger.Log(LogEvent{"info", "info message", time.Now()})   // 输出: 当前时间 info info message

    logger = FileLogger{AbstractLogger{"info"}, file}
    logger.Log(LogEvent{"info", "info message", time.Now()}) // 输出到文件中
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta contoh ConsoleLogger untuk output log dan contoh FileLogger untuk output fail log. Hanya satu log dikeluarkan pada konsol kerana LogLevel ditetapkan kepada maklumat dan LogLevel bagi log pertama ialah nyahpepijat, yang tidak memenuhi syarat output. Log yang sama ditulis pada fail dan akhirnya output ke app.log fail.

5. Ringkasan
Walaupun tiada mekanisme pewarisan kelas dalam Java atau C++ dalam Golang, kami boleh menggunakan antara muka untuk mencapai pewarisan yang serupa. Melaksanakan templat kelas dalam Golang ialah teknik yang sangat berguna, yang boleh membantu kami menggunakan semula kod biasa dan meningkatkan kebolehselenggaraan kod. Kod sampel di atas menunjukkan cara menggunakan Golang untuk melaksanakan templat kelas dan menyediakan penyelesaian penggunaan semula kod untuk kelas log.

Atas ialah kandungan terperinci templat kelas pelaksanaan golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!