В Go нельзя использовать строковое значение как квалификатор типа. То есть нельзя написать:
var Type string
Type = "int"
var foo Type // так не работает
var foo "int" // и так не работает
Из известных мне языков так нигде нельзя.
В конкретном вашем примере сниппеты похоже на JSON. В Go это парсится примерно так:
type Message struct {
Type string
Payload json.RawMessage // разобрать со второго захода
}
var message Message
// первый заход, Payload пока не парсится, остаётся json.RawMessage
json.Unmarshal(data, message)
// варианты типа
switch message.Type {
case "string":
dst = new(StringPayload) // готовим контейнер для типа string
case "int":
dst = new(IntPayload) // контейнер для int
}
// теперь разбираем Payload в подходящий контейнер
json.Unmarshal(message.Payload, dst)
gRPC обычно использует в качестве контейнера для сообщений protobuf. protobuf это строго типизированный язык. Передать на нём generic сообщение вообще вряд ли получится, по крайней мере не видел что бы кто нибудь делал.