code: func (ch *Channel) ExchangeBind(destination, key, source string, noWait bool, args Table) error {
  	if err := args.Validate(); err != nil {
  		return err
  	}
  
  	return ch.call(
  		&exchangeBind{
  			Destination: destination,
  			Source:      source,
  			RoutingKey:  key,
  			NoWait:      noWait,
  			Arguments:   args,
  		},
  		&exchangeBindOk{},
  	)
  }
docs: /*
  ExchangeBind binds an exchange to another exchange to create inter-exchange
  routing topologies on the server.  This can decouple the private topology and
  routing exchanges from exchanges intended solely for publishing endpoints.
  
  Binding two exchanges with identical arguments will not create duplicate
  bindings.
  
  Binding one exchange to another with multiple bindings will only deliver a
  message once.  For example if you bind your exchange to `amq.fanout` with two
  different binding keys, only a single message will be delivered to your
  exchange even though multiple bindings will match.
  
  Given a message delivered to the source exchange, the message will be forwarded
  to the destination exchange when the routing key is matched.
  
    ExchangeBind("sell", "MSFT", "trade", false, nil)
    ExchangeBind("buy", "AAPL", "trade", false, nil)
  
    Delivery       Source      Key      Destination
    example        exchange             exchange
    -----------------------------------------------
    key: AAPL  --> trade ----> MSFT     sell
                         \---> AAPL --> buy
  
  When noWait is true, do not wait for the server to confirm the binding.  If any
  error occurs the channel will be closed.  Add a listener to NotifyClose to
  handle these errors.
  
  Optional arguments specific to the exchanges bound can also be specified.
  */