Both the FCM and GCM documentation give the structure of the data
payload as a map[string]string (although google's GCM package implements it at a map[string]interface{})
However, there are many cases where a simple flat key:value structure doesn't meet the needs of an application. Some examples are when a slice of values is needed, or when another non-trivial struct needs to be sent.
What would be the cleanest way of sending more complicated data structures as a map[string]string?
Conclusion: I have marked the answer by fl0cke as correct given that it provides a solution to sending complex data with FCM / GCM using Go. However, it is clear from the FCM documentation, that the intention is for the data to be key:value string pairs moving forward, and so to be sure that nothing gets broken in the future, I will be sticking to simple key:value string pairs.