Main input type from workflow execution to activity execution

I wonder what is the right way to compose a generic input parameter, so that different activities can take their own parameters out through type assertion.

tried to put parameters into map[string]interface{} (e.g. a http.header and a string) and pass to execute workflow, but when I grab the header in activity execution using (input[“header”]).(http.Header), it is not http.header type anymore, type change to map[string]interface{}, is there a way to get back original type?

header := make(http.Header)
	header.Add("a", "b")
	header.Add("c", "d")
	data := map[string]interface{}{
		"header": header,
		"body":   "test",

The input should be JSON marshallable and unmarshallable. As JSON doesn’t contain type information the map of values of interface{} type is not going to work.