Différentes façons de passer des chaînes comme arguments de la fonction go (golang)

Je lisais certains vont code et de dire quelques différentes façons de transmettre les canaux aller. Peut-être qu'ils sont les mêmes, mais je me demandais si il n'y a aucune différence puisque je ne pouvais pas trouver de la documentation en ligne:

1)

func serve(ch <-chan interface{}){ //do stuff }

2)

func serve(ch chan<- interface{}){ //do stuff }

3)

func serve(ch chan interface{}){ //do stuff }

4)

func server(ch *chan interface{}){ //do stuff}

Je me demandais quelle était la différence entre eux ont été et si elles étaient équivalentes façons de faire la même chose: passer d'un canal autour de différents goroutines.

NOTE: je suis conscient qu'il n'y a aucune raison de passer un pointeur sur un chan, la carte, ou une tranche ou d'une fonction de valeur, puisque ce sont tous les types de référence en interne qui contient un pointeur (à l'exception serait si vous souhaitez que le destinataire de l'appel pour changer le type de référence de l'en-tête). La seule raison pour laquelle j'ai fourni, il est pour l'exhaustivité (c'est à dire de vraiment fournir tous les cas un canal pourrait être tenté d'être passé en paramètre et à faire sur la question qui, espérons-le, les références de tous les moyens pour ce faire et les compare).