Напиши решето Эратосфена на go
package main

import (
    fmt
)

func eratosthenes(n int) []bool {
    primes := make([]bool, n+1)
    for i := 2; i <= n; i++ {
        primes[i] = true
    }
    for p := 2; p*p <= n; p++ {
        if primes[p] == true {
            for i := p * p; i <= n; i += p {
                primes[i] = false
            }
        }
    }
    return primes
}

func main() {
    fmt.Println(Enter a positive integer:)
    var n int
    _, err := fmt.Scanf(%d, &n)
    if err != nil {
        fmt.Println(Invalid input)
        return
    }
    primes := eratosthenes(n)
    fmt.Println(Primes up to, n, :)
    for i := 2; i <= n; i++ {
        if primes[i] == true {
            fmt.Println(i)
        }
    }
}

В этой реализации мы используем булевый массив primes, чтобы отслеживать, является ли число i простым или нет. Мы начинаем с предположения, что все числа от 2 до n являются простыми, а затем устанавливаем primes[i] в false для каждого i, который является кратным p для каждого простого числа p. Мы продолжаем до тех пор, пока p^2 не станет больше n.

Затем мы выводим все простые числа, используя булевый массив primes. В main мы запрашиваем у пользователя ввод положительного целого числа n и выводим все простые числа до n.
Насколько оптимально такое решение? Нет ли более оптимального?