No matter what interactive fiction system you use, there are going to be a lot of operations that they all provide: draw text, request user input, show a save-file dialog, and so on. The problem is that each operating system has its own method for doing these things. If I wrote code to display text on a Unix terminal, that same code would not work to display in a window on a Windows system.
Glk serves as a layer between an interpreter and the operating system. Instead of writing Unix-specific code, you instead write Glk-specific code. Once this is done, the same interpreter can be built to run on any system for which a Glk library is available.
So a Glk library contains the operating system-specific code, which means you have one Glk implementation for Windows, another for Unix, and so on. The advantage to this is analogous to the advantage of using the Z-machine instead of writing your game for a particular operating system. Once you’ve written an interpreter that uses Glk, it will run wherever Glk is ported, much the way that a game written for the Z-machine will run everywhere a Z-machine interpreter has been written.
Different Glk libraries provide different user interfaces, more or less. Windows Glk, for example, provides an interface that is familiar to Windows users, complete with Windows-based file dialogs. glkterm, on the other hand, is a completely text-based interface for Unix users, presenting an interface similar to, say, Infocom’s games on MS-DOS. However, an interpreter doesn’t have to care which version is being used: the programmer’s interface is identical for all Glk libraries; it’s just the user interface that varies.
As such, end-users need not care about Glk. If you use Gargoyle, for example, you’re using a Glk library, but that knowledge is immaterial. Glk should be invisible to the end-user. If you’re writing an interpreter, on the other hand, using Glk is probably a smart choice. By using Glk, you’ll get an interpreter that works on at least Unix, MacOS, and Windows; and what’s more, when a new Glk library is released (say, for a smartphone), your interpreter will automatically work with it.
The biggest downside to Glk, currently, is probably the lack of control over text styles. This is an understandable choice, because Glk has to cater to systems where text style support might be minimal or non-existent, but it does limit fine-grained control over text appearance (you can say text is emphasized, or is being used as a header, and so on, but ultimately the Glk library gets to choose what happens). And if you’re writing a Z-machine interpreter, you will not be able to support version 6 stories, at least not properly. Zarf made the reasonable choice to accommodate future games rather than ensuring that Journey, Shogun, and Arthur will be playable on Glk interpreters. I’ve tried shoehorning V6 support into a Glk interpreter and it just doesn’t work.