Salam, kolega!
Beberapa bulan yang lalu, saya mulai melihat Golang dengan tujuan menggunakannya untuk aplikasi desktop. Saya menyukai bahasa, volume, dan pokok bahasan dari paket-paket yang ditulis untuknya membuat kesan, tetapi situasi dengan GUI tidak begitu cerah. Saya tidak akan membahas detailnya sekarang, cukuplah untuk mengatakan bahwa setelah membaca beberapa ulasan dan melihat sekilas paket-paket GUI yang ada, saya memutuskan untuk menulis sendiri, terutama karena saya memiliki pengalaman dengan ini.
Pikiran pertama saya adalah pergi sepanjang jalan yang sudah dipukuli: menulis satu set fungsi yang sesuai di C, atau lebih tepatnya, mengadaptasi yang sudah siap - apa yang saya tulis sekali untuk Harbour dan C ++, ikat dengan menggunakan cgo (C API untuk Golang) dan pembungkus ramah Saya bahkan mulai melakukan ini, menerima jendela pertama, tetapi ketika saya membayangkan berapa banyak pekerjaan yang masih ada di depan, secara terpisah untuk Windows, secara terpisah untuk Linux, murni pekerjaan teknis, karena saya sudah melewatinya, antusiasme saya agak dingin.
Dan kemudian ide lain datang.
Saya sudah memiliki perpustakaan GUI, HwGUI untuk Harbour, yang cukup fungsional, lintas-platform, yang saya gunakan secara teratur untuk aplikasi saya. Semua yang saya butuhkan sudah diimplementasikan di dalamnya. Mengapa tidak menulis berdasarkan program yang berfungsi sebagai semacam server GUI. Setelah memulai server ini, server akan diam-diam mendengarkan port tertentu, dan, setelah menerima koneksi dari program Golang saya, itu akan membuat windows, widget sebagai tanggapan atas permintaannya, memanipulasi mereka dan memberikan umpan balik ketika ada kejadian dari widget yang muncul - dengan kata lain, mengimplementasikan GUI untuk itu. Semua detail tingkat rendah implementasi GUI sudah ada di perpustakaan, untuk Windows - melalui panggilan langsung ke WinAPI, untuk Linux / Unix dan, mungkin, macOs - melalui GTK. Selain itu, saya tidak bermaksud membuat server dalam arti kata yang lengkap, ia tidak akan menerima koneksi dari berbagai program - ini akan menimbulkan kesulitan tambahan yang tidak perlu. Untuk setiap instance dari program Golang, instance terpisah dari server GUI akan diluncurkan, yang selanjutnya menyederhanakan tugas. Secara umum, program akan terdiri dari dua proses, satu di antaranya melakukan tugas utama, yang lain bertanggung jawab untuk antarmuka.
Paket yang sesuai untuk Go harus mencakup prosedur Init, yang memulai server GUI dan menggabungkannya, dan seperangkat struktur, metode, fungsi untuk membuat windows dan widget dan memanipulasinya. Konten utama dari semua fungsi ini adalah mengirim pesan dengan format tertentu (berdasarkan JSON) ke server dan menerima pesan darinya. Komunikasi didukung menggunakan dua port tcp / ip, satu bertanggung jawab untuk mengirim permintaan ke server, yang lain bertanggung jawab untuk menerima sinyal dari server untuk pemrosesan acara (mengklik tombol, menutup jendela, dll.). Tugasnya relatif sederhana, paketnya sendiri kecil. Tidak perlu menggunakan cgo, tidak perlu mengikat ke perpustakaan pihak ketiga, semua kode di Go murni. File executable dari program itu sendiri dan file executable dari server GUI semuanya.
Pilihan Harbour + HwGUI untuk implementasi server GUI bagi saya terutama disebabkan oleh fakta bahwa ini adalah alat “asli” saya, solusi paling sederhana dan tercepat. Tapi ini pilihan yang bagus dari sudut pandang lain. Di sini, menurut saya, keuntungan utama:
- lintas-platform “di dalam kotak”;
- apa yang disebut tampilan dan rasa asli, karena di bawah Windows itu secara eksklusif panggilan WinAPI, di Linux / Unix - GTK; berapa banyak GTK "asli" untuk macO yang saya benar-benar tidak tahu;
- kemampuan untuk menggunakan Harbor sebagai bahasa skrip bawaan, fragmen kode untuk eksekusi dapat ditransfer ke server - event handler, misalnya, yang dapat membongkar program utama dari beberapa detail implementasi. Selain itu, Harbour baik untuk banyak hal, untuk bekerja dengan dbf dan beberapa database, misalnya;
- implementasi pencetakan;
- kemampuan untuk menggunakan formulir layar yang dibuat oleh Perancang (utilitas HwGUI). Formulir ini disimpan dalam format XML dan dapat digunakan tanpa perubahan pada OS apa pun yang menjalankan server;
- kemampuan untuk menggunakan formulir laporan yang dibuat oleh Desainer yang sama untuk dicetak (juga dalam XML).
Singkatnya, saya mulai melakukan ini dan sebagian besar pekerjaan telah selesai. Kedua proyek, GuiServer dan kerangka GUI Eksternal Golang ada di Github, semua tautan ada di akhir artikel. Berikut adalah beberapa tangkapan layar. Tidak ada yang istimewa, hanya tes.
Ini adalah kotak dialog sederhana:
Dan ini dilakukan berdasarkan contoh dari buku Kernigan dan Donovan:
Sekarang tujuan utama dari proyek ini adalah untuk memastikan bahwa pasangan yang manis ini, Eksternal dan GuiServer, dapat melakukan semua yang dapat dilakukan HwGUI. Nah, dalam proses membuat beberapa aplikasi nyata menggunakan Eksternal, akan menjadi jelas apa yang lebih dibutuhkan.
Ini bisa menjadi akhir, saya menunda deskripsi paket Golang untuk lain waktu. Tetapi hal utama dalam artikel ini baru saja dimulai. Bagaimanapun, metode yang dijelaskan untuk mengimplementasikan kerangka kerja GUI dengan server GUI yang sama dapat digunakan untuk bahasa lain. C, Python, Java, ..., bahkan Perl dan PHP (dan mengapa tidak?) - lihat judul artikel. Biaya minimum - dan solusi GUI yang cukup fungsional siap. Hal yang paling sulit untuk setiap bahasa tertentu bukanlah implementasi pertukaran dengan server, melainkan bahwa solusi ini cocok secara organik ke dalam paradigma, ke dalam logika internalnya. Jika ada yang ingin membuat kerangka kerja untuk bahasa mereka, saya akan mencoba memberikan semua bantuan yang mungkin dalam memperoleh informasi yang diperlukan dan, mungkin, dalam menambahkan beberapa fitur ke server GUI.
Sejalan dengan paket Golang, saya membuat analog untuk Harbour, terutama untuk keperluan verifikasi / debugging. Saya tidak mungkin melakukan kerangka kerja untuk Perl, tetapi untuk C atau C ++ sangat mungkin. Dan inilah alasannya: lagipula, ada fitur menarik lain yang terkait dengan penggunaan server GUI, dapat dijalankan di komputer lain. Program utama berjalan di satu komputer, dan antarmuka di komputer lain. Segera terlihat di sini adalah opsi untuk menggunakan kasing ini:
- program utama berjalan pada server Linux / Unix di mana shell grafis tidak diinstal sama sekali;
- program utama berjalan di komputer orang lain (dengan akuntan bersyarat di perusahaan Anda), dan Anda, tanpa mengganggu, mengelolanya sendiri;
- program utama berjalan pada smartphone, dan Anda menggali bagian dalamnya dari komputer biasa;
- program utama berjalan pada controller, pada beberapa Arduino, Raspberry atau rekan-rekan mereka, di mana mungkin tidak ada monitor normal. Terhubung dengan laptop Anda - dan pergi.
Nah, untuk opsi terakhir ini, kerangka-C untuk server GUI mungkin akan berguna, saya pikir kemungkinan ini sangat menjanjikan.
Dan akhirnya, tautannya:
github.com/alkresin/guiserver - GuiServer di Github
github.com/alkresin/external - Eksternal (Go package) di Github
www.kresin.ru/guisrv.html - halaman
GuiServer di situs saya, di sini Anda dapat mengunduh binari yang sudah jadi
habr.com/post/198618 - artikel saya tentang Harbor ada di sini di Habré
en.wikipedia.org/wiki/Harbor - Harbour di Wikipedia
www.kresin.ru/harbour.html - Halaman Harbour di situs web saya
www.kresin.ru/hwgui.html - halaman HwGUI di situs web saya
PS: Jelas bahwa beberapa orang akan menginstal Harbour dan HwGUI untuk membangun GuiServer dari sumber, jadi saya secara teratur memposting binari yang dikumpulkan pada halaman GuiServer di situs saya - untuk Windows, Debian 8 32-bit, Ubuntu 18,04 64-bit. Saya bisa berkumpul untuk Fedora, tetapi di bawah macOs - sayangnya, saya tidak memilikinya dalam jarak berjalan kaki.