videos poner para how hashtags google como concurrency go channel

concurrency - poner - Diferentes formas de pasar canales como argumentos en función en go(golang)



youtube google videos (3)

Estos son diferentes tipos de canales. Ver http://golang.org/ref/spec#Channel_types . Para las cosas del puntero: Poco común, pero podría ser útil si quieres cambiar el canal desde el interior de la función (nunca lo vi en la naturaleza).

Estaba leyendo algunos códigos y digo algunas formas diferentes de pasar los canales. Tal vez son lo mismo, pero me preguntaba si hay alguna diferencia ya que no pude encontrar la documentación en línea:

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}

Me preguntaba cuál era la diferencia entre ellos y si solo eran formas equivalentes de hacer lo mismo: pasar un canal alrededor de diferentes goroutines.

NOTA: Soy consciente de que no hay ninguna razón para pasar un puntero a un chan, mapa, corte o valor de función, ya que todos son tipos de referencia que contienen internamente un puntero (la excepción sería si desea que el destinatario cambie el encabezado del tipo de referencia). La única razón por la que lo proporcioné es para completar (es decir, para proporcionar realmente cada forma en que se podría intentar pasar un canal como parámetro y para hacer una pregunta que, con suerte, hace referencia a todas las formas de hacer esto y las compara).


La regla de oro: la flecha muestra si los datos están entrando (saliendo) o saliendo de (entrada) del canal. Ninguna flecha es un canal de propósito general.

chan <- writing to channel (output channel) <- chan reading from channel (input channel) chan read from or write to channel (input/output channel)


Siempre recomiendo que la dirección se pase a donde sea posible, por ejemplo

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

Al incluir la flecha <-chan o chan<- , estás logrando tres cosas:

  • Estás dejando en claro que el parámetro es el final de un canal.
  • Usted está expresando claramente qué fin se está suministrando.
  • Usted está dando más información al compilador para su comprobación. Si el cuerpo de la función intenta usar el extremo equivocado del canal, el compilador puede generar un error.

Estas son buenas razones para mostrar el final del canal siempre que sea posible.

Su tercer caso muestra que no se especifica el final del canal. Esto permite el acceso a ambos extremos del canal, lo que será correcto en algunos casos, pero en otros casos puede conducir a errores accidentales.

El cuarto caso, pasando un puntero a un canal, es bastante inusual y tal vez un poco extraño. Si quisiera cambiar el canal, sería más claro incluirlo como un parámetro de retorno.