diff options
Diffstat (limited to 'doc/progs')
-rw-r--r-- | doc/progs/cat.go | 32 | ||||
-rw-r--r-- | doc/progs/cat_rot13.go | 50 | ||||
-rw-r--r-- | doc/progs/echo.go | 16 | ||||
-rw-r--r-- | doc/progs/fd.go | 46 | ||||
-rw-r--r-- | doc/progs/helloworld2.go | 4 | ||||
-rw-r--r-- | doc/progs/helloworld3.go | 10 | ||||
-rw-r--r-- | doc/progs/print.go | 20 | ||||
-rw-r--r-- | doc/progs/print_string.go | 18 | ||||
-rw-r--r-- | doc/progs/printf.go | 11 | ||||
-rwxr-xr-x | doc/progs/run | 9 | ||||
-rw-r--r-- | doc/progs/server.go | 4 | ||||
-rw-r--r-- | doc/progs/sort.go | 61 | ||||
-rw-r--r-- | doc/progs/sortmain.go | 32 | ||||
-rw-r--r-- | doc/progs/sum.go | 4 |
14 files changed, 181 insertions, 136 deletions
diff --git a/doc/progs/cat.go b/doc/progs/cat.go index f74faf4f1..98e4bbf1a 100644 --- a/doc/progs/cat.go +++ b/doc/progs/cat.go @@ -5,40 +5,40 @@ package main import ( - FD "fd"; - Flag "flag"; + "fd"; + "flag"; ) -func cat(fd *FD.FD) { +func cat(file *fd.FD) { const NBUF = 512; var buf [NBUF]byte; for { - switch nr, er := fd.Read(buf); true { + switch nr, er := file.Read(buf); true { case nr < 0: - print("error reading from ", fd.Name(), ": ", er, "\n"); + print("error reading from ", file.String(), ": ", er.String(), "\n"); sys.exit(1); case nr == 0: // EOF return; case nr > 0: - if nw, ew := FD.Stdout.Write(buf[0:nr]); nw != nr { - print("error writing from ", fd.Name(), ": ", ew, "\n"); + if nw, ew := fd.Stdout.Write(buf[0:nr]); nw != nr { + print("error writing from ", file.String(), ": ", ew.String(), "\n"); } } } } func main() { - Flag.Parse(); // Scans the arg list and sets up flags - if Flag.NArg() == 0 { - cat(FD.Stdin); + flag.Parse(); // Scans the arg list and sets up flags + if flag.NArg() == 0 { + cat(fd.Stdin); } - for i := 0; i < Flag.NArg(); i++ { - fd, err := FD.Open(Flag.Arg(i), 0, 0); - if fd == nil { - print("can't open ", Flag.Arg(i), ": error ", err, "\n"); + for i := 0; i < flag.NArg(); i++ { + file, err := fd.Open(flag.Arg(i), 0, 0); + if file == nil { + print("can't open ", flag.Arg(i), ": error ", err, "\n"); sys.exit(1); } - cat(fd); - fd.Close(); + cat(file); + file.Close(); } } diff --git a/doc/progs/cat_rot13.go b/doc/progs/cat_rot13.go index 1ef0f6443..1868c6f0e 100644 --- a/doc/progs/cat_rot13.go +++ b/doc/progs/cat_rot13.go @@ -5,11 +5,12 @@ package main import ( - FD "fd"; - Flag "flag"; + "fd"; + "flag"; + "os"; ) -var rot13_flag = Flag.Bool("rot13", false, nil, "rot13 the input") +var rot13_flag = flag.Bool("rot13", false, "rot13 the input") func rot13(b byte) byte { if 'a' <= b && b <= 'z' { @@ -22,8 +23,8 @@ func rot13(b byte) byte { } type Reader interface { - Read(b []byte) (ret int64, errno int64); - Name() string; + Read(b []byte) (ret int, err *os.Error); + String() string; } type Rot13 struct { @@ -31,21 +32,19 @@ type Rot13 struct { } func NewRot13(source Reader) *Rot13 { - r13 := new(Rot13); - r13.source = source; - return r13 + return &Rot13{source} } -func (r13 *Rot13) Read(b []byte) (ret int64, errno int64) { // TODO: use standard Read sig? +func (r13 *Rot13) Read(b []byte) (ret int, err *os.Error) { r, e := r13.source.Read(b); - for i := int64(0); i < r; i++ { + for i := 0; i < r; i++ { b[i] = rot13(b[i]) } return r, e } -func (r13 *Rot13) Name() string { - return r13.source.Name() +func (r13 *Rot13) String() string { + return r13.source.String() } // end of Rot13 implementation @@ -53,38 +52,37 @@ func cat(r Reader) { const NBUF = 512; var buf [NBUF]byte; - if rot13_flag.BVal() { + if *rot13_flag { r = NewRot13(r) } for { switch nr, er := r.Read(buf); { case nr < 0: - print("error reading from ", r.Name(), ": ", er, "\n"); + print("error reading from ", r.String(), ": ", er.String(), "\n"); sys.exit(1); case nr == 0: // EOF return; case nr > 0: - nw, ew := FD.Stdout.Write(buf[0:nr]); + nw, ew := fd.Stdout.Write(buf[0:nr]); if nw != nr { - print("error writing from ", r.Name(), ": ", ew, "\n"); + print("error writing from ", r.String(), ": ", ew.String(), "\n"); } } } } func main() { - var bug FD.FD; - Flag.Parse(); // Scans the arg list and sets up flags - if Flag.NArg() == 0 { - cat(FD.Stdin); + flag.Parse(); // Scans the arg list and sets up flags + if flag.NArg() == 0 { + cat(fd.Stdin); } - for i := 0; i < Flag.NArg(); i++ { - fd, err := FD.Open(Flag.Arg(i), 0, 0); - if fd == nil { - print("can't open ", Flag.Arg(i), ": error ", err, "\n"); + for i := 0; i < flag.NArg(); i++ { + file, err := fd.Open(flag.Arg(i), 0, 0); + if file == nil { + print("can't open ", flag.Arg(i), ": error ", err, "\n"); sys.exit(1); } - cat(fd); - fd.Close(); + cat(file); + file.Close(); } } diff --git a/doc/progs/echo.go b/doc/progs/echo.go index 9dc828565..71711bfc0 100644 --- a/doc/progs/echo.go +++ b/doc/progs/echo.go @@ -5,11 +5,11 @@ package main import ( - OS "os"; - Flag "flag"; + "os"; + "flag"; ) -var n_flag = Flag.Bool("n", false, nil, "don't print final newline") +var n_flag = flag.Bool("n", false, "don't print final newline") const ( Space = " "; @@ -17,16 +17,16 @@ const ( ) func main() { - Flag.Parse(); // Scans the arg list and sets up flags + flag.Parse(); // Scans the arg list and sets up flags var s string = ""; - for i := 0; i < Flag.NArg(); i++ { + for i := 0; i < flag.NArg(); i++ { if i > 0 { s += Space } - s += Flag.Arg(i) + s += flag.Arg(i) } - if !n_flag.BVal() { + if !*n_flag { s += Newline } - OS.Stdout.WriteString(s); + os.Stdout.WriteString(s); } diff --git a/doc/progs/fd.go b/doc/progs/fd.go index 76b784f83..4c3ac1587 100644 --- a/doc/progs/fd.go +++ b/doc/progs/fd.go @@ -4,21 +4,21 @@ package fd -import Syscall "syscall" +import ( + "os"; + "syscall"; +) export type FD struct { - fildes int64; // file descriptor number - name string; // file name at Open time + fildes int64; // file descriptor number + name string; // file name at Open time } func NewFD(fd int64, name string) *FD { if fd < 0 { return nil } - n := new(FD); - n.fildes = fd; - n.name = name; - return n + return &FD{fd, name} } export var ( @@ -27,36 +27,36 @@ export var ( Stderr = NewFD(2, "/dev/stderr"); ) -export func Open(name string, mode int64, perm int64) (fd *FD, errno int64) { - r, e := Syscall.open(name, mode, perm); - return NewFD(r, name), e +export func Open(name string, mode int64, perm int64) (fd *FD, err *os.Error) { + r, e := syscall.open(name, mode, perm); + return NewFD(r, name), os.ErrnoToError(e) } -func (fd *FD) Close() int64 { +func (fd *FD) Close() *os.Error { if fd == nil { - return Syscall.EINVAL + return os.EINVAL } - r, e := Syscall.close(fd.fildes); + r, e := syscall.close(fd.fildes); fd.fildes = -1; // so it can't be closed again - return 0 + return nil } -func (fd *FD) Read(b []byte) (ret int64, errno int64) { +func (fd *FD) Read(b []byte) (ret int, err *os.Error) { if fd == nil { - return -1, Syscall.EINVAL + return -1, os.EINVAL } - r, e := Syscall.read(fd.fildes, &b[0], int64(len(b))); - return r, e + r, e := syscall.read(fd.fildes, &b[0], int64(len(b))); + return int(r), os.ErrnoToError(e) } -func (fd *FD) Write(b []byte) (ret int64, errno int64) { +func (fd *FD) Write(b []byte) (ret int, err *os.Error) { if fd == nil { - return -1, Syscall.EINVAL + return -1, os.EINVAL } - r, e := Syscall.write(fd.fildes, &b[0], int64(len(b))); - return r, e + r, e := syscall.write(fd.fildes, &b[0], int64(len(b))); + return int(r), os.ErrnoToError(e) } -func (fd *FD) Name() string { +func (fd *FD) String() string { return fd.name } diff --git a/doc/progs/helloworld2.go b/doc/progs/helloworld2.go index f2b4cae70..b40905565 100644 --- a/doc/progs/helloworld2.go +++ b/doc/progs/helloworld2.go @@ -4,8 +4,8 @@ package main -import OS "os" // this package contains features for basic I/O +import "os" // this package contains features for basic I/O func main() { - OS.Stdout.WriteString("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n"); + os.Stdout.WriteString("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n"); } diff --git a/doc/progs/helloworld3.go b/doc/progs/helloworld3.go index f282bcefb..f6decccbf 100644 --- a/doc/progs/helloworld3.go +++ b/doc/progs/helloworld3.go @@ -4,14 +4,14 @@ package main -import FD "fd" +import fd "fd" func main() { hello := []byte{'h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '\n'}; - FD.Stdout.Write(hello); - fd, errno := FD.Open("/does/not/exist", 0, 0); - if fd == nil { - print("can't open file; errno=", errno, "\n"); + fd.Stdout.Write(hello); + file, err := fd.Open("/does/not/exist", 0, 0); + if file == nil { + print("can't open file; err=", err.String(), "\n"); sys.exit(1); } } diff --git a/doc/progs/print.go b/doc/progs/print.go new file mode 100644 index 000000000..ed3f4e269 --- /dev/null +++ b/doc/progs/print.go @@ -0,0 +1,20 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "fmt" + +func main() { + var u64 uint64 = 1<<64-1; + fmt.printf("%d %d\n", u64, int64(u64)); + + // harder stuff + type T struct { a int; b string }; + t := T{77, "Sunset Strip"}; + a := []int{1, 2, 3, 4}; + fmt.printf("%v %v %v\n", u64, t, a); + fmt.print(u64, " ", t, " ", a, "\n"); + fmt.println(u64, t, a); +} diff --git a/doc/progs/print_string.go b/doc/progs/print_string.go new file mode 100644 index 000000000..47d4a4b9d --- /dev/null +++ b/doc/progs/print_string.go @@ -0,0 +1,18 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "fmt" + +type T struct { a int; b string } + +func (t *T) String() string { + return fmt.sprint(t.a) + " " + t.b +} + +func main() { + t := &T{77, "Sunset Strip"}; + fmt.println(t) +} diff --git a/doc/progs/printf.go b/doc/progs/printf.go new file mode 100644 index 000000000..be1ac9731 --- /dev/null +++ b/doc/progs/printf.go @@ -0,0 +1,11 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "fmt" + +func main() { + fmt.printf("hello, %s\n", "world"); +} diff --git a/doc/progs/run b/doc/progs/run index e04c1031e..ece3fcaf1 100755 --- a/doc/progs/run +++ b/doc/progs/run @@ -16,6 +16,9 @@ for i in \ sum.go \ sort.go \ sortmain.go \ + print.go \ + printf.go \ + print_string.go \ sieve.go \ sieve1.go \ server1.go \ @@ -46,7 +49,7 @@ function testitpipe { testit helloworld "" "Hello, world; or Καλημέρα κόσμε; or こんにちは 世界" testit helloworld2 "" "Hello, world; or Καλημέρα κόσμε; or こんにちは 世界" -testit helloworld3 "" "hello, world can't open file; errno=2" +testit helloworld3 "" "hello, world can't open file; err=No such file or directory" testit echo "hello, world" "hello, world" testit sum "" "6" @@ -58,6 +61,10 @@ echo $rot13 | testit cat_rot13 "--rot13" $alphabet testit sortmain "" "Sunday Monday Tuesday Thursday Friday" +testit print "" "18446744073709551615 -1 18446744073709551615 {77 Sunset Strip} [1 2 3 4] 18446744073709551615 {77 Sunset Strip} [1 2 3 4] 18446744073709551615 {77 Sunset Strip} [1 2 3 4]" +testit printf "" "hello, world" +testit print_string "" "77 Sunset Strip" + testitpipe sieve "sed 10q" "2 3 5 7 11 13 17 19 23 29" testitpipe sieve "sed 10q" "2 3 5 7 11 13 17 19 23 29" diff --git a/doc/progs/server.go b/doc/progs/server.go index cdf2b2e8c..233972fc4 100644 --- a/doc/progs/server.go +++ b/doc/progs/server.go @@ -5,8 +5,8 @@ package main type Request struct { - a, b int; - replyc chan int; + a, b int; + replyc chan int; } type BinOp (a, b int) int; diff --git a/doc/progs/sort.go b/doc/progs/sort.go index db0d8b16e..3d4fd98b2 100644 --- a/doc/progs/sort.go +++ b/doc/progs/sort.go @@ -5,26 +5,23 @@ package sort export type SortInterface interface { - len() int; - less(i, j int) bool; - swap(i, j int); + Len() int; + Less(i, j int) bool; + Swap(i, j int); } export func Sort(data SortInterface) { - // Bubble sort for brevity - for i := 0; i < data.len(); i++ { - for j := i; j < data.len(); j++ { - if data.less(j, i) { - data.swap(i, j) - } + for i := 1; i < data.Len(); i++ { + for j := i; j > 0 && data.Less(j, j-1); j-- { + data.Swap(j, j-1); } } } export func IsSorted(data SortInterface) bool { - n := data.len(); + n := data.Len(); for i := n - 1; i > 0; i-- { - if data.less(i, i - 1) { + if data.Less(i, i - 1) { return false; } } @@ -33,40 +30,34 @@ export func IsSorted(data SortInterface) bool { // Convenience types for common cases -export type IntArray struct { - data *[]int; -} +export type IntArray []int -func (p *IntArray) len() int { return len(p.data); } -func (p *IntArray) less(i, j int) bool { return p.data[i] < p.data[j]; } -func (p *IntArray) swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i]; } +func (p IntArray) Len() int { return len(p); } +func (p IntArray) Less(i, j int) bool { return p[i] < p[j]; } +func (p IntArray) Swap(i, j int) { p[i], p[j] = p[j], p[i]; } -export type FloatArray struct { - data *[]float; -} +export type FloatArray []float -func (p *FloatArray) len() int { return len(p.data); } -func (p *FloatArray) less(i, j int) bool { return p.data[i] < p.data[j]; } -func (p *FloatArray) swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i]; } +func (p FloatArray) Len() int { return len(p); } +func (p FloatArray) Less(i, j int) bool { return p[i] < p[j]; } +func (p FloatArray) Swap(i, j int) { p[i], p[j] = p[j], p[i]; } -export type StringArray struct { - data *[]string; -} +export type StringArray []string -func (p *StringArray) len() int { return len(p.data); } -func (p *StringArray) less(i, j int) bool { return p.data[i] < p.data[j]; } -func (p *StringArray) swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i]; } +func (p StringArray) Len() int { return len(p); } +func (p StringArray) Less(i, j int) bool { return p[i] < p[j]; } +func (p StringArray) Swap(i, j int) { p[i], p[j] = p[j], p[i]; } // Convenience wrappers for common cases -export func SortInts(a *[]int) { Sort(&IntArray{a}); } -export func SortFloats(a *[]float) { Sort(&FloatArray{a}); } -export func SortStrings(a *[]string) { Sort(&StringArray{a}); } +export func SortInts(a []int) { Sort(IntArray(a)); } +export func SortFloats(a []float) { Sort(FloatArray(a)); } +export func SortStrings(a []string) { Sort(StringArray(a)); } -export func IntsAreSorted(a *[]int) bool { return IsSorted(&IntArray{a}); } -export func FloatsAreSorted(a *[]float) bool { return IsSorted(&FloatArray{a}); } -export func StringsAreSorted(a *[]string) bool { return IsSorted(&StringArray{a}); } +export func IntsAreSorted(a []int) bool { return IsSorted(IntArray(a)); } +export func FloatsAreSorted(a []float) bool { return IsSorted(FloatArray(a)); } +export func StringsAreSorted(a []string) bool { return IsSorted(StringArray(a)); } diff --git a/doc/progs/sortmain.go b/doc/progs/sortmain.go index 3f2e4f098..3f0c891e6 100644 --- a/doc/progs/sortmain.go +++ b/doc/progs/sortmain.go @@ -4,22 +4,22 @@ package main -import Sort "sort" +import "sort" func ints() { data := []int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}; - a := Sort.IntArray{&data}; - Sort.Sort(&a); - if !Sort.IsSorted(&a) { + a := sort.IntArray(data); + sort.Sort(a); + if !sort.IsSorted(a) { panic() } } func strings() { data := []string{"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}; - a := Sort.StringArray{&data}; - Sort.Sort(&a); - if !Sort.IsSorted(&a) { + a := sort.StringArray(data); + sort.Sort(a); + if !sort.IsSorted(a) { panic() } } @@ -31,12 +31,12 @@ type Day struct { } type DayArray struct { - data *[]*Day; + data []*Day; } -func (p *DayArray) len() int { return len(p.data); } -func (p *DayArray) less(i, j int) bool { return p.data[i].num < p.data[j].num; } -func (p *DayArray) swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i]; } +func (p *DayArray) Len() int { return len(p.data); } +func (p *DayArray) Less(i, j int) bool { return p.data[i].num < p.data[j].num; } +func (p *DayArray) Swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i]; } func days() { Sunday := Day{ 0, "SUN", "Sunday" }; @@ -47,13 +47,13 @@ func days() { Friday := Day{ 5, "FRI", "Friday" }; Saturday := Day{ 6, "SAT", "Saturday" }; data := []*Day{&Tuesday, &Thursday, &Sunday, &Monday, &Friday}; - a := DayArray{&data}; - Sort.Sort(&a); - if !Sort.IsSorted(&a) { + a := DayArray{data}; + sort.Sort(&a); + if !sort.IsSorted(&a) { panic() } - for i := 0; i < len(data); i++ { - print(data[i].long_name, " ") + for i, d := range data { + print(d.long_name, " ") } print("\n") } diff --git a/doc/progs/sum.go b/doc/progs/sum.go index c8e7b10a7..3ca1a5877 100644 --- a/doc/progs/sum.go +++ b/doc/progs/sum.go @@ -4,7 +4,7 @@ package main -func sum(a *[]int) int { // returns an int +func sum(a []int) int { // returns an int s := 0; for i := 0; i < len(a); i++ { s += a[i] @@ -14,6 +14,6 @@ func sum(a *[]int) int { // returns an int func main() { - s := sum(&[]int{1,2,3}); // pass address of int array + s := sum([3]int{1,2,3}); // a slice of the array is passed to sum print(s, "\n"); } |