From Wikipedia:
What is going wrong?
The main problem is complexity. There are hundreds of different methods for every occasion, which need to be redefined to slightly change the logic of the interface. For example, if you need to count something, first you inherit the class and add a new variable, then you initialize it in the constructor or any other method, and finally, you write a function to increase the variable.
The consequences of the complexity of EDP include a lot of widgets for any occasion and numerous window properties (modal, clickable, disabled, etc.).
Problems started with earlier versions of Windows when the limitations of C++ led to a convoluted application logic called EDP. But now we have Go with goroutines and channels, which allows us to turn to simplicity.
Firstly, the GUI application still consumes user input events such as keystrokes and mouse movements. However, when you need to focus on your own local logic, there should be an opportunity to implement all the logic in one place. You can use inheritance if you want, but it is not mandatory.
Secondly, drawing, processing events, and changing data are different tasks of a GUI application. When implementing complex logic, you may prefer to separate different tasks into different modules. However, a simple GUI application or a simple GUI application element can be written in a straightforward way.
Finally, an application can handle many windows at once. You can write a main loop if you want. When using Go, you can run multiple goroutines for the event loop of each window, which will be executed simultaneously.