code: func NewEngineGroup(args1 interface{}, args2 interface{}, policies ...GroupPolicy) (*EngineGroup, error) {
  	var eg EngineGroup
  	if len(policies) > 0 {
  		eg.policy = policies[0]
  	} else {
  		eg.policy = RoundRobinPolicy()
  	}
  
  	driverName, ok1 := args1.(string)
  	conns, ok2 := args2.([]string)
  	if ok1 && ok2 {
  		engines := make([]*Engine, len(conns))
  		for i, conn := range conns {
  			engine, err := NewEngine(driverName, conn)
  			if err != nil {
  				return nil, err
  			}
  			engine.engineGroup = &eg
  			engines[i] = engine
  		}
  
  		eg.Engine = engines[0]
  		eg.slaves = engines[1:]
  		return &eg, nil
  	}
  
  	master, ok3 := args1.(*Engine)
  	slaves, ok4 := args2.([]*Engine)
  	if ok3 && ok4 {
  		master.engineGroup = &eg
  		for i := 0; i < len(slaves); i++ {
  			slaves[i].engineGroup = &eg
  		}
  		eg.Engine = master
  		eg.slaves = slaves
  		return &eg, nil
  	}
  	return nil, ErrParamsType
  }
docs: // NewEngineGroup creates a new engine group