Go言語のインストール 最新リリースを保つ
にあるとおり
$ cd go/src $ hg pull $ hg update release $ ./all.bashで最新のソースを引っ張ってきてコンパイラとリンカ、
ライブラリがコンパイルされます。
$ cd go/src $ hg pull $ hg update release $ ./all.bashで最新のソースを引っ張ってきてコンパイラとリンカ、
package main
import (
"os"
)
func main() {
os.Stdout.WriteString("Content-Type: text/plain;charset=us-ascii\n\n");
os.Stdout.WriteString("Hello world!\n\n");
}
2)これをコンパイル、リンクします8g plain.go 8l -o plain.cgi plain.83) 以下の内容で.htaccess ファイルを作成します
Options +FollowSymLinks +ExecCGI AddHandler cgi-script .cgiこれで、plain.cgiと.htaccessを同じディレクトリに置き、
for i := 0; i < len(a); i++ { ... }
* UTF-8のときは一文字ずつになるのでしょうか。たぶんなるのでしょう。
組み込み関数と書かれていますが、実際はどうなっているのか不明です。
sizeof的組み込み関数なのでしょう。
package main
import (
"fmt"
)
func main() {
var a[16]uint;
fmt.Printf("len(a)=%d\n",len(a))
str := "12345678901234567890"
fmt.Printf("len(str)=%d\n",len(str))
}
結果は
$ ./8.out len(a)=16 len(str)=40アレ? UTF8はバイト数ででてますね。 ということはこれsizeofと同じということのようです。 あと、文字列の最後にnullとかはあるのかもしれないけど入ってないと。
for i, v := range a { ... }
こんな書き方でforeachになる、と。
foreach気持ち悪いけどfor i:=0;i< sizeof(a);i++ はオッケーという
Cっぽい思想をよく汲んでいると思います。
今っぽい書き方をさせつつもアセンブラを意識できる記述なのかな。
よくできている。
しかし今時の人に受けるのかな。そこはわかりません。
package main
import (
"fmt"
)
func main() {
str := "12345678901234567890"
for v := range str {
fmt.Printf("%c\n",v)
}
}
こちらも普通にbyteで処理されちゃいますね。
$ ./8.out ! " # $ % & '
var arrayOfInt [10]int;これもまた、C言語のようにIntのポインタとして扱うことはできません。
var a[10]int;という配列があったときに
as := a[3:5];とすると、asはa[3], a[4], a[5] を参照できる配列のスライスとなるようです。
func sum(a []int) int { // returns an int
s := 0;
for i := 0; i < len(a); i++ {
s += a[i]
}
return s
}
という配列を引数に持つ関数の実行の際に、
あらかじめ配列をべつに定義する必要は無くて、定義する場所でs := sum(&[3]int{1,2,3})
としてスライスを生成して直接代入すると、
参照する側ではint s={1,2,3} が見えると。
ユーザー定義型でこれができたらかなりいろいろ楽になりそうです。
システムコール周りが天国になりそうな雰囲気。
スライスの生成で変数が使えるのでしょうか。たぶん、できるのでしょう。
やってみたいけど今は先に進みます。
スライスって言う呼び名は日本語的にイマイチだなぁ。
配列の部分参照みたいな言い方にするともっといまいちですがやや直感的と思います。
m := map[string]int{"one":1 , "two":2}
map関数はすごく便利なのできっとそれもあるのだろうと思います。
s := "hello"
if s[1] != 'e' { os.Exit(1) }
s = "good bye"
var p *string = &s
*p = "ciao"
s[0] = 'x';
(*p)[1] = 'y';
In C++ terms, Go strings are a bit like const strings, while pointers to strings are analogous to const string references.
package main
import (
"os"
"flag" // command line option parser
)
var omitNewline = flag.Bool("n", false, "don't print final newline")
const (
Space = " "
Newline = "\n"
)
func main() {
flag.Parse() // Scans the arg list and sets up flags
var s string = ""
for i := 0; i < flag.NArg(); i++ {
if i > 0 {
s += Space
}
s += flag.Arg(i)
}
if !*omitNewline {
s += Newline
}
os.Stdout.WriteString(s)
}
NArgっていうのはどうやらArgvのことを言うようです。$ 8g echo.go $ 8l echo.8 $ ./8.out
$素で実行すると何もおこりません。
$ ./8.out echoのテスト echoのテスト $そのままですね。
const ( Space = " " Newline = "\n" )もできるようです。
var s string = "";としますが、""で括った物は文字列であることがコンパイラは知っているので
var s = "";と書くこともできて、さらに明示的な定義&代入を
s := "";とも書けるようにしました、と。
package main
import (
"os"
"fmt" /* Printを使うため */
"flag" // command line option parser
)
var omitNewline = flag.Bool("n", false, "don't print final newline")
const (
Space = " "
Newline = "\n"
)
func main() {
flag.Parse() // Scans the arg list and sets up flags
var s string = "";
for i:=0 ; i < flag.NArg(); i++ {
if i > 0 {
s += Space
}
s += flag.Arg(i)
}
if !*omitNewline {
s += Newline
}
os.Stdout.WriteString(s)
fmt.Printf("%d\n",flag.NArg()) /* 引数の個数を出力*/
}
for で:=を使って宣言したiはスコープがforの中に制限されるのですね。$ ./8.out 0動いていそうです。
$ ./8.out echoのテスト その2 その3 echoのテスト その2 その3 3引数を変えてみましょう。
$ ./8.out echoのテスト その2\ その3 echoのテスト その2 その3 2期待通り動作しています。
Google goのチュートリアルを読んでつぶやいています。