• 0 Posts
  • 5 Comments
Joined 2 years ago
cake
Cake day: June 19th, 2023

help-circle

  • I don’t think it’s that uncommon. Let’s say you have a function that handles a request. A common use case is to add permission checks before applying that function. You can write a generic permission check a bit like this:

    func NeedsPermission(f func(Request) (Response, error), perm string) func(Request) (Response, error) {
        return func(r Request) (Response, error) {
            if !check(r, perm) {
                return nil, NewPermError(perm)
            }
            return f(r)
        }
    }
    
    // elsewhere
    Bar := NeedsPermission(Foo, "superman")
    

    This would allow you to separate the permission check logic from the business logic. Though to be fair, in Go they prefer to keep things as simple as possible but it’s just to illustrate that these concepts are not that alien.



  • Go’s syntax is vastly superior once you have more complicated signatures, then the left-to-right truly matters. For example a variable that contains a pointer to a function that takes a function and an int and returns another function (like a decorator).

    In C the order becomes very hard to understand and you really have to read the thing several times to understand the type of fp:

    int (*(*fp)(int (*)(int, int), int))(int, int)

    In Go, you can just read from left to right and you can easily understand what f’s type is:

    f func(func(int,int) int, int) func(int, int) int

    It’s just much more readable.

    See: https://go.dev/blog/declaration-syntax