Golang如何在运行时创建动态大小的数组

Golang如何在运行时创建动态大小的数组 我正在将这段 Crystal 代码翻译成 Go

def gen_pg_parameters(prime)
  # Create prime generator parameters for given Pn
  puts "using Prime Generator parameters for P#{prime}"
  primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
  modpg, res_0 = 1, 0              
  primes.each { |prm| res_0 = prm; break if prm > prime; modpg *= prm }

  restwins = [] of Int32          
  inverses = Array.new(modpg + 2, 0)  
  pc, inc, res = 5, 2, 0            
  while pc < modpg // 2        
    if gcd(pc, modpg) == 1   
      pc_mc = modpg - pc        
      inv_r = modinv(pc, modpg)    
      inverses[pc] = inv_r            
      inverses[inv_r] = pc           
      inv_r = modinv(pc_mc, modpg)  
      inverses[pc_mc] = inv_r    
      inverses[inv_r] = pc_mc   
      if res + 2 == pc; restwins << pc; restwins << (pc_mc + 2) end 
      res = pc
    end
    pc += inc; inc ^= 0b110
  end
  restwins.sort!;          restwins << (modpg + 1)  
  inverses[modpg + 1] = 1; inverses[modpg - 1] = modpg - 1
  {modpg, res_0, restwins.size, restwins, inverses}
end

以下是 Go 语言的翻译版本。

func gen_pg_parameters(prime int) (int, int, int, []int, []int) {
  // Create prime generator parameters for given Pn
  fmt.Println("using Prime Generator parameters for P",prime)
  primes := []int{2, 3, 5, 7, 11, 13, 17, 19, 23}
  modpg, res_0 := 1, 0          
  for _, prm := range primes { res_0 = prm; if prm > prime { break }; modpg *= prm }
  
  restwins := []int{}            
  inverses := [modpg + 2]int{}         
  pc, inc, res := 5, 2, 0       
  for pc < modpg / 2 {           
    if gcd(pc, modpg) == 1 {          
      var pc_mc = modpg - pc     
      var inv_r = modinv(pc, modpg)  
      inverses[pc] = inv_r        
      inverses[inv_r] = pc           
      inv_r = modinv(pc_mc, modpg)    
      inverses[pc_mc] = inv_r        
      inverses[inv_r] = pc_mc   
      if res + 2 == pc { restwins = append(restwins, pc, pc_mc + 2) }
      res = pc
    }
    pc += inc; inc ^= 0b110
  }
  sort.Ints(restwins); restwins = append(restwins, modpg + 1)
  inverses[modpg + 1] = 1; inverses[modpg - 1] = modpg - 1 
  pairscnt := len(restwins)
  return modpg, res_0, pairscnt, restwins, inverses
}

Go 语言无法在运行时使用 [modpg + 2]int 这样的表达式来创建 inverses 数组。 那么在 Go 中应该如何实现呢?是否必须使用哈希表或关联数组?


更多关于Golang如何在运行时创建动态大小的数组的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢,效果非常好。 🙂

我最终做了: inverses := make([]int, modpg + 2)

更多关于Golang如何在运行时创建动态大小的数组的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


无法创建动态大小的数组。可以使用无固定大小的切片作为替代。

可以使用 make([]int, size, capacity) 来预先分配切片。

在Go中,运行时创建动态大小的数组需要使用切片(slice)。以下是修正后的代码:

func gen_pg_parameters(prime int) (int, int, int, []int, []int) {
    // Create prime generator parameters for given Pn
    fmt.Println("using Prime Generator parameters for P", prime)
    primes := []int{2, 3, 5, 7, 11, 13, 17, 19, 23}
    modpg, res_0 := 1, 0
    for _, prm := range primes {
        res_0 = prm
        if prm > prime {
            break
        }
        modpg *= prm
    }

    restwins := []int{}
    inverses := make([]int, modpg+2) // 使用make创建动态大小的切片
    pc, inc, res := 5, 2, 0
    for pc < modpg/2 {
        if gcd(pc, modpg) == 1 {
            pc_mc := modpg - pc
            inv_r := modinv(pc, modpg)
            inverses[pc] = inv_r
            inverses[inv_r] = pc
            inv_r = modinv(pc_mc, modpg)
            inverses[pc_mc] = inv_r
            inverses[inv_r] = pc_mc
            if res+2 == pc {
                restwins = append(restwins, pc, pc_mc+2)
            }
            res = pc
        }
        pc += inc
        inc ^= 0b110
    }
    sort.Ints(restwins)
    restwins = append(restwins, modpg+1)
    inverses[modpg+1] = 1
    inverses[modpg-1] = modpg - 1
    pairscnt := len(restwins)
    return modpg, res_0, pairscnt, restwins, inverses
}

关键修改是使用 make([]int, modpg+2) 替代 [modpg+2]int{}make 函数在运行时动态分配指定长度的切片,切片底层是数组,可以像数组一样通过索引访问:

// 创建长度为10的int切片
slice := make([]int, 10)
slice[0] = 1
slice[9] = 10

// 创建长度和容量都为10的切片
slice2 := make([]int, 10, 10)

// 如果需要后续追加元素,可以指定更大的容量
slice3 := make([]int, 10, 20) // 长度10,容量20
slice3 = append(slice3, 100)  // 可以追加元素

切片提供了数组的所有功能,同时支持动态调整大小。在您的代码中,由于 modpg 在运行时确定,使用切片是正确的选择。

回到顶部