func main() { var primeTable [100]int primeTable[0] = 2 primeSize := 1 for n := 3; n <= len(primeTable); n += 2 { // n は素数か判定していく。 isPrime := true // 3 は素数ですし。 for i := 1; i < primeSize; i++ { // なんかここが素数判定ロジックっぽいな。奇数をそれまでに見つけた素数で割って、割り切れたら素数じゃない。 p := primeTable[i] if p*p > n { // 全部判定判定しなくてもいいらしい。知らん。 break } if n%p == 0 { isPrime = false break } } if isPrime { primeTable[primeSize] = n // n が素数だったら primeTable に格納していく。 primeSize++ // 格納したら index を一つ進めておく。 } } for i := 0; i < primeSize; i++ { spew.Print(primeTable[i], " ") } }
func main() { var composites [100]bool // ゼロ値は false だ。とりあえず全部合成数(素数でない整数)であるとみなす。 for n := 2; n < len(composites); n++ { // メロスにはエラストネテスの篩はわからぬ。 if composites[n] { continue } for m := 2 * n; m < len(composites); m += n { composites[m] = true } spew.Print(n, " ") } }
func pppc(pc uintptr, ok bool, args ...interface{}) { if ok { f := runtime.FuncForPC(pc) fParts := strings.Split(f.Name(), ".") fun := fParts[len(fParts)-1] s := spew.Sprintf("vvvvvvvvvvvvvvv %s vvvvvvvvvvvvvvv\n", fun) spew.Print(s) spew.Dump(args...) spew.Println(strings.Repeat("^", len(s)-1)) } else { spew.Println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv") spew.Dump(args...) spew.Println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") } }
// parseFile parses the given file and pretty-prints its abstract syntax tree to // standard output, optionally using the Gocc generated lexer. func parseFile(path string, goccLexer bool) error { // Create lexer for the input. buf, err := ioutilx.ReadFile(path) if err != nil { return errutil.Err(err) } if path == "-" { fmt.Fprintln(os.Stderr, "Parsing from standard input") } else { fmt.Fprintf(os.Stderr, "Parsing %q\n", path) } var s parser.Scanner if goccLexer { s = goccscanner.NewFromBytes(buf) } else { s = handscanner.NewFromBytes(buf) } // Parse input. p := parser.NewParser() file, err := p.Parse(s) if err != nil { if err, ok := err.(*errors.Error); ok { // Unwrap Gocc error. return parser.NewError(err) } return errutil.Err(err) } f := file.(*ast.File) for _, decl := range f.Decls { fmt.Println("=== [ Top-level declaration ] ===") fmt.Println() fmt.Printf("decl type: %T\n", decl) fmt.Println() fmt.Println("decl:", decl) fmt.Println() pretty.Print(decl) fmt.Println() spew.Print(decl) fmt.Println() fmt.Println() } return nil }
// TestSpew executes all of the tests described by spewTests. func TestSpew(t *testing.T) { initSpewTests() t.Logf("Running %d tests", len(spewTests)) for i, test := range spewTests { buf := new(bytes.Buffer) switch test.f { case fCSFdump: test.cs.Fdump(buf, test.in) case fCSFprint: test.cs.Fprint(buf, test.in) case fCSFprintf: test.cs.Fprintf(buf, test.format, test.in) case fCSFprintln: test.cs.Fprintln(buf, test.in) case fCSPrint: b, err := redirStdout(func() { test.cs.Print(test.in) }) if err != nil { t.Errorf("%v #%d %v", test.f, i, err) continue } buf.Write(b) case fCSPrintln: b, err := redirStdout(func() { test.cs.Println(test.in) }) if err != nil { t.Errorf("%v #%d %v", test.f, i, err) continue } buf.Write(b) case fCSSdump: str := test.cs.Sdump(test.in) buf.WriteString(str) case fCSSprint: str := test.cs.Sprint(test.in) buf.WriteString(str) case fCSSprintf: str := test.cs.Sprintf(test.format, test.in) buf.WriteString(str) case fCSSprintln: str := test.cs.Sprintln(test.in) buf.WriteString(str) case fCSErrorf: err := test.cs.Errorf(test.format, test.in) buf.WriteString(err.Error()) case fCSNewFormatter: fmt.Fprintf(buf, test.format, test.cs.NewFormatter(test.in)) case fErrorf: err := spew.Errorf(test.format, test.in) buf.WriteString(err.Error()) case fFprint: spew.Fprint(buf, test.in) case fFprintln: spew.Fprintln(buf, test.in) case fPrint: b, err := redirStdout(func() { spew.Print(test.in) }) if err != nil { t.Errorf("%v #%d %v", test.f, i, err) continue } buf.Write(b) case fPrintln: b, err := redirStdout(func() { spew.Println(test.in) }) if err != nil { t.Errorf("%v #%d %v", test.f, i, err) continue } buf.Write(b) case fSdump: str := spew.Sdump(test.in) buf.WriteString(str) case fSprint: str := spew.Sprint(test.in) buf.WriteString(str) case fSprintf: str := spew.Sprintf(test.format, test.in) buf.WriteString(str) case fSprintln: str := spew.Sprintln(test.in) buf.WriteString(str) default: t.Errorf("%v #%d unrecognized function", test.f, i) continue } s := buf.String() if test.want != s { t.Errorf("ConfigState #%d\n got: %s want: %s", i, s, test.want) continue } } }
func main() { //* おそらく、ファイルの全内容をメモリに流し込むのが、最も基本的なファイル読み込みタスクでしょう。 dat, err := ioutil.ReadFile("/tmp/dat") check(err) spew.Print(string(dat)) spew.Println() //* 読み込んだファイルの一部分をより制御したい場合もしばしばあるでしょう。その場合、ファイルの '''Open''' から始めると、'''os.File''' の値を取得可能です。 f, err := os.Open("/tmp/dat") // たぶんどこかでクローズするのだろう。 check(err) //* ファイルの先頭からバイト単位で読み取ることができます。5 バイトまでを読み取ることもできますし、実際に読み取らせたいバイト数を指定できます((ってことでいいですかね?うまく訳せなかった。))。 b1 := make([]byte, 5) // 要素が 5 の byte スライスを作成する。値は 0 埋めされている。 n1, err := f.Read(b1) // 読み取ったバイト数とエラーが返る。引数にしたスライスにはバイト分の文字が入る。 check(err) spew.Printf("%#+v bytes: %#+v\n", n1, string(b1)) spew.Dump(b1) spew.Println() //* ファイルの既知の位置を '''Seek''' することも可能です。また、そこから '''Read''' することも可能です。 o2, err := f.Seek(6, 0) // 先頭からのオフセット, そこからどれくらい進めるか、を指定するっぽい。で、オフセット値が返るっぽい。 check(err) b2 := make([]byte, 2) n2, err := f.Read(b2) // 読み取ったバイト数が返るっぽい。 check(err) spew.Printf("%#+v bytes @ %#+v: %#+v\n", n2, o2, string(b2)) spew.Println() //* '''io''' パッケージはファイルの読み込みに役立ついくつかの関数を提供します。例えば、上で示した読み込みが、'''ReadAtLeast''' でより頑健に行えます。 o3, err := f.Seek(6, 0) check(err) b3 := make([]byte, 2) n3, err := io.ReadAtLeast(f, b3, 2) spew.Printf("%#+v bytes @ %#+v: %#+v\n", n3, o3, string(b3)) //* 組み込みの rewind はありませんが、'''Seek(0, 0)''' で実現可能です。 // 上で 2 回 Seek() してるけど、オフセット値がなんで累積してないの? _, err = f.Seek(0, 0) //* '''bufio''' パケージはバッファリーダーを実装しています。このバッファリーダーは、多数の小さな読み込みで効率化が行え、リーダーが提供する追加の読み込みメソッドあり便利です。 r4 := bufio.NewReader(f) b4, err := r4.Peek(5) // これは読み取ったバイトスライスを返すのか。 check(err) spew.Printf("5 bytes: %#+v\n", string(b4)) //* 処理が終わったらファイルをクローズします(大抵、これは '''Open''' の直後に '''defer''' を使って計画的に実行されます)。 f.Close() /* * おまけ * 読み込みバッファサイズが実際のファイルサイズを超えたらどうなるの? * 結論: panic になった。つまり、check() 内が実行された。 */ /* * spew.Println() * spew.Println("### omake ###") * file, err := os.Open("/tmp/dat") * check(err) * tb1 := make([]byte, 20) * tn1, err := file.Read(tb1) * check(err) * spew.Printf("%#+v bytes: %#+v\n", tn1, string(tb1)) * spew.Println() * to2, err := file.Seek(20, 0) * check(err) * tb2 := make([]byte, 2) * tn2, err := file.Read(tb2) * check(err) * spew.Printf("%#+v bytes @ %#+v: %#+v\n", tn2, to2, string(tb2)) * spew.Println() * tr4 := bufio.NewReader(file) * tb4, err := tr4.Peek(20) * check(err) * spew.Printf("5 bytes: %#+v\n", string(tb4)) * file.Close() */ }