// $G $D/$F.go && $L $F.$A && ./$A.out // 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 func setpd(a []int) { // print("setpd a=", a, " len=", len(a), " cap=", cap(a), "\n"); for i:=0; i<len(a); i++ { a[i] = i; } } func sumpd(a []int) int { // print("sumpd a=", a, " len=", len(a), " cap=", cap(a), "\n"); t := 0; for i:=0; i<len(a); i++ { t += a[i]; } // print("sumpd t=", t, "\n"); return t; } func setpf(a *[20]int) { // print("setpf a=", a, " len=", len(a), " cap=", cap(a), "\n"); for i:=0; i<len(a); i++ { a[i] = i; } } func sumpf(a *[20]int) int { // print("sumpf a=", a, " len=", len(a), " cap=", cap(a), "\n"); t := 0; for i:=0; i<len(a); i++ { t += a[i]; } // print("sumpf t=", t, "\n"); return t; } func res(t int, lb, hb int) { sb := (hb-lb)*(hb+lb-1)/2; if t != sb { print( "lb=", lb, "; hb=", hb, "; t=", t, "; sb=", sb, "\n"); panic("res") } } // call ptr dynamic with ptr dynamic func testpdpd() { a := make([]int, 10, 100); if len(a) != 10 && cap(a) != 100 { panic("len and cap from new: ", len(a), " ", cap(a), "\n"); } a = a[0:100]; setpd(a); a = a[0:10]; res(sumpd(a), 0, 10); a = a[5:25]; res(sumpd(a), 5, 25); } // call ptr fixed with ptr fixed func testpfpf() { var a [20]int; setpf(&a); res(sumpf(&a), 0, 20); } // call ptr dynamic with ptr fixed from new func testpdpf1() { a := new([40]int); setpd(a); res(sumpd(a), 0, 40); b := (*a)[5:30]; res(sumpd(b), 5, 30); } // call ptr dynamic with ptr fixed from var func testpdpf2() { var a [80]int; setpd(&a); res(sumpd(&a), 0, 80); } // generate bounds error with ptr dynamic func testpdfault() { a := make([]int, 100); print("good\n"); for i:=0; i<100; i++ { a[i] = 0; } print("should fault\n"); a[100] = 0; print("bad\n"); } // generate bounds error with ptr fixed func testfdfault() { var a [80]int; print("good\n"); for i:=0; i<80; i++ { a[i] = 0; } print("should fault\n"); x := 80; a[x] = 0; print("bad\n"); } func main() { testpdpd(); testpfpf(); testpdpf1(); testpdpf2(); // print("testpdfault\n"); testpdfault(); // print("testfdfault\n"); testfdfault(); }