Within your program shell function, use "$@" to refer to the list of all command line arguments given to the function. With the quotes, each command line argument given to program would additionally be individually quoted (you generally want this).
program () {
"$GOBIN"/program "$@"
}
You would then call program like so:
program -p hello_world -tSu
or, if you want to pass hello world instead of hello_world,
program -p 'hello world' -tSu
Using $1 refers to only the first command line argument (and $2 would refer to the second, etc.), as you have noticed. The value of $1 would additionally be split on white-spaces and each generated string would undergo filename globbing, since the expansion is unquoted. This would make it impossible to correctly pass an argument that contains spaces or filename globbing patterns to the function.