问题
I would love to simplify my code, with better utilisation of for loop indexes. The goal is to change out all UP
once for new UP
once, which means take down each UP
one and bring it up again. There should always be one in UP
state while this process takes place, so I need to cover the following scenarios:
up - up == delete -> create -> delete -> create
down - down == delete -> create -> delete -> create
up - down == delete -> create -> delete -> create
down - up == delete -> create -> delete -> create
up == create -> delete -> create
down == create -> delete -> create
This is what I have come up with, but I find it a bit cumbersome, and I', sure there is a room for an improvement.
For Instance could I go without using slices for holding the indexes countStateAvailable
and countStateDown
fun myFunc() {
var countStateAvailable []int
var countStateDown []int
lags := convertToDirectconnect(lagPair, amz.dcLags)
vi := newVIFProvider(amz.dcRead, amz.dcWrite, bd, amz.trace, amz.pr)
for i := 0; i < len(lags); i++ {
if i == 0 {
for j := 0; j < 2; j++ {
vis, err := amz.dcRead.DescribeVirtualInterfaces(&directconnect.DescribeVirtualInterfacesInput{ConnectionId: lags[j].LagId})
if err != nil {
return err
}
for k := 0; k < len(vis.VirtualInterfaces); k++ {
if *vis.VirtualInterfaces[k].OwnerAccount == cfg.RemoteAccountID {
if aws.StringValue(vis.VirtualInterfaces[k].VirtualInterfaceState) == directconnect.VirtualInterfaceStateAvailable {
countStateAvailable = append(countStateAvailable, j)
} else if aws.StringValue(vis.VirtualInterfaces[k].VirtualInterfaceState) == directconnect.VirtualInterfaceStateDown {
countStateDown = append(countStateDown, j)
}
}
}
}
}
if len(countStateAvailable) == 0 {
fmt.Println("contains 1 or more down elements")
err := amz.Create(cfg, nst)
if err != nil {
return err
}
return nil
}
// check if second or both elements are UP
if countStateAvailable[0] == 1 || len(countStateAvailable) == 2 {
fmt.Println("second or both elements are UP")
err = vi.DeleteSingle(cfg, lags[i], i)
cfg.Neighbors, err = vi.CreateSingle(cfg, lags[i], i)
if err != nil {
return err
}
err = vi.RestorePollSingle(cfg, lags[i], i)
if err != nil {
return err
}
} else if countStateAvailable[0] == 0 { // first element is UP, delete second element first
fmt.Println("first element is UP, delete second element first")
err = vi.DeleteSingle(cfg, lags[1], 1)
cfg.Neighbors, err = vi.CreateSingle(cfg, lags[1], 1)
if err != nil {
return err
}
err = vi.RestorePollSingle(cfg, lags[1], 1)
if err != nil {
return err
}
err = vi.DeleteSingle(cfg, lags[0], 0)
cfg.Neighbors, err = vi.CreateSingle(cfg, lags[0], 0)
if err != nil {
return err
}
err = vi.RestorePollSingle(cfg, lags[0], 0)
if err != nil {
return err
}
return nil
} else {
fmt.Println("contains 1 or more down elements")
err := amz.Create(cfg, nst)
if err != nil {
return err
}
return nil
}
}
fmt.Println("countStateAvailable: ", countStateAvailable)
fmt.Println("countStateDown: ", countStateDown)
return nil
}
来源:https://stackoverflow.com/questions/61253247/decision-making-inside-a-for-loop-and-taking-certain-path-based-on-output-from-g