私が書いたGo言語プログラミング入門 on Google App Engineにある記述で間違いがあったのですが、正誤表に書くには長いので、この記事に残しておこうと思います。
P.125のnew関数とmake関数の使い分けの所で、
次のように間違った例を掲載しています。
intArray := new([]int)
fmt.Fprintf(w, "%d¥n", intArray[0])
これは、そもそも書き方が間違っているという指摘を受けまして、
確認をしてみました。結論は間違ってます。
new([]int)が返す型は「*[]int」型です。int型配列に対するポインタが返されます。
しかも、配列の長さを指定していませんので、配列の長さが0です。
中身がありません。
したがって、intArray[0]と書くのは間違いで、(*intArray)[0]と書くのが
正しい表記となりますが、配列の中身がないので、実行時にエラーになります。
しかし、次のように、配列の長さを指定した形で使えば実行時エラーにはならなくなります。
intArray := new([5]int)
fmt.Fprintf(w, "%d¥n", (*intArray)[0])
検証したプログラムも掲載しておきます。
検証したバージョンはVer.1.6.1ですが、未検証ですが1.5.5でも問題ないと思います。
検証したバージョンはVer.1.6.1ですが、未検証ですが1.5.5でも問題ないと思います。
package newsample import ( "fmt" "http" ) func init() { http.HandleFunc("/", handler) } func handler(w http.ResponseWriter, r *http.Request) { // 書籍の例は間違い! // intArray := new([]int) // // fmt.Fprintf(w, "%d\n", intArray[0]) intArray := new([5]int) fmt.Fprintf(w, "%d\n", (*intArray)[0]) intArray2 := make([]int, 5) fmt.Fprintf(w, "%d\n", intArray2[0]) }
0 件のコメント:
コメントを投稿