前回は年末納品で力尽きて記録が止まりましたが……
多めに記事ストックを作っておく等々の対処で何とか継続できました
……そろそろ、質の方を上げたいですね(白目
前回は年末納品で力尽きて記録が止まりましたが……
多めに記事ストックを作っておく等々の対処で何とか継続できました
……そろそろ、質の方を上げたいですね(白目
io/ioutilパッケージを使ってパイプで繋いだ標準出力から文字列を受け取る
package main import ( "fmt" "io/ioutil" "os" ) func main() { stat, _ := os.Stdin.Stat() if (stat.Mode() & os.ModeCharDevice) == 0 { fmt.Println("data is being piped to stdin") bytes, err := ioutil.ReadAll(os.Stdin) if err != nil { fmt.Printf("We got error on os.Stdin") } else { fmt.Println(string(bytes)) } } else { fmt.Println("No stdin pipe") } }
$ go run samplescript.go No stdin pipe $ echo "hoge" | go run samplescript.go data is being piped to stdin hoge
GO言語のメッソドは一見関数に似てますが……関数名の前に型を指定するトコがあります。
これにより、特定の型等々に付随する処理を書き下す事が可能です。
package main import "fmt" type MyType struct { num int body []byte } func (mt *MyType) String() string { return fmt.Sprintf("%d::%s\n", mt.num, mt.body) } func main() { p := new(MyType) p.num = 12 p.body = []byte("yes") fmt.Printf("%v\n", p.String()) }
Go言語の構造体型は変数を意味合いレベルでカタマリにできるもので……なんだかクラスに似ています。
今回はこれの初期化方法について。
MyTypeというint型と[]byte型をもつ構造体を定義し、
を考えます。
package main import "fmt" type MyType struct { num int body []byte } func main() { // p := new(MyType) p.num = 12 p.body = []byte("yes") fmt.Printf("%d::%s\n", p.num, p.body) //複合リテラルによる単純化 p2 := MyType{34,[]byte("great")} fmt.Printf("%d::%s\n", p2.num, p2.body) }
実行すると、以下の通り
$ go run hoge.go 12::yes 34::great
日本語や中国語も含めたマルチバイト文字もよろしくパースしてくれます
UTF-8でサポートしてる必要があるので、ヒエログリフとかは駄目です。
package main import "fmt" func main() { for pos, char := range "これ不错one까요?" { fmt.Printf("character %c starts at byte position %d\n", char, pos) } }
$ go run forsample.go character こ starts at byte position 0 character れ starts at byte position 3 character 不 starts at byte position 6 character 错 starts at byte position 9 character o starts at byte position 12 character n starts at byte position 13 character e starts at byte position 14 character 까 starts at byte position 15 character 요 starts at byte position 18 character ? starts at byte position 21
前回の事例でもちょっと触れたdeferについて。
これは例外の地獄ネストを回避するための素敵な機能です。
一時ファイルを使う場合の事例は以下の通り。
import ( "io/ioutil" ) func Something () { file, _ := ioutil.TempFile(os.TempDir(), "") defer os.Remove(file.Name()) defer file.Close() //something to do }
なにが良いかというと……
リソースを作った直後に開放処理を記述できるので見通しがよくなります。
deferはキューされて処理されます。
今回の場合、ファイルポインタを閉じてから、ファイルの実体を消すようにしています。
こうしないとWindows系では意図せずクラッシュする事もあるそうなので注意してください。
タイトルにある「セルフビルド」という言葉を知りませんでした。
オビの文言から建築や地域社会の事を指すのかと思っていましたが……どうもそうでない。
我々技術屋の語彙に落とし込むと「Makers Movement」に相当する言葉のようです。
そんな事もあってか、本書の内容は建物を中心に据えつつも実に混沌としています。
以下、裏表紙の冊子紹介をそのまま引用します。
フツーの人が手作りした驚嘆の家!トタンでできたバー、トラック上の2階建住居、アウトサイダーアート的な「秘密の家」、びっしりの貝殻でできた公園、湖に浮かぶ村、0円~500万円で建てた家、「磯崎新の隠れ家」など、圧倒されまくる30の物件。自分の家という世界や、共同体を作る熱い思い。文庫化にあたり2篇を新取材。迫力のカラー写真満載!
わけが分かりませんね。
上記の例では日本の事例ばかりですが、東南アジアの水上生活者、ネパールのコミュニティ等々、海外の話題もあります。
と、紹介されている事例は豊富で非常に面白いのです。
問題は「典型的文化人」としか言い様が無い作者の視点。
特に前書きから中盤までが酷い。
回りくどい表現で大量消費社会ガー欧米ガー等々、左巻きの政治パンフレットめいた悪臭が鼻をつきます。
ところが、途中で急に文体が丸くなり、表現もスッキリしてきたりします。
連載元雑誌がサブカル誌からインテリア誌に変わったらしく……ナルホド。
0円ハウスの件は個人的にお気に入りトピックなので補足をば。
文中で「一冊では紹介しきれない」と書いてありますが、
こちらの本では作り方から載ってます。
作者の視点も、「現社会を肯定しつつ、軸をずらした視点を提供する」というスタンスで好感が持てます。
興味のある方は、こちらも是非。