Skip to main content

6 posts tagged with "Go"

View All Tags

· 3 min read

ちょっと前に面白そうなモジュールを見つけた。
それがESP-WROOM-02というやつ。
何が面白いかというと、Arduino + Wi-Fiみたいな構成であること。
この大きさでスケッチを書けて、しかも、Wi-Fi搭載しているからそのままHTTPを叩ける!
なんと、サーバーにもなる!!
こんなにすごくて1個600円くらい!

とりあえず、ボタンを押すとPOSTしている間だけLEDが光るものを作ってみた。

IMG_7961

[-]ESP-WROOM-02 の Arduino 環境で I2C 制御 - Qiita
http://qiita.com/ikesato/items/92f4cb143e7aeb5e0f9b 配線はこのページのとおり。

· One min read

Go言語でJSONをStructに変換する際のポイント。

type User struct {
Id string `json:"id"`
FirstName string `json:"first_name"` // OK
// FirstName string `json: "first_name"` // NG :の後ろに空白がある。
// FirstName string `json:first_name` // NG スネークケースが""で括られてない
}

これはハマる!!

· 2 min read

昨日のレシーバによる挙動の違いがとりあえず解決した。 解決というより、挙動がわかっていたからそれを使って実装したというだけであって、なんだこれ?って気がしないでもない。

なんだこれって思う部分はA構造体のSelfフィールドって、型は違えど同じAインスタンスというところ。

http://play.golang.org/p/cJOGzaLhKm
package main

import (
"fmt"
"reflect"
)

type I interface {
Call()
Method(interface{})
SetSelf(I)
}

type A struct {
Self I
a1 bool
}

func (a *A) Call() {
a.Self.Method(a.Self)
}
func (a *A) SetSelf(i I) {
a.Self = i
}

func (a *A) Method(i interface{}) {
ip := reflect.ValueOf(i)
iv := ip.Elem()
fmt.Println("name:", iv.Type().Name())
for ii := 0; ii < iv.NumField(); ii++ {
fmt.Println(iv.Field(ii))
}
}

type B struct {
A
b1 int
b2 float32
b3 bool
}

func main() {
var bi interface{}
bi = &B{}
t := reflect.TypeOf(bi).Elem()
b := reflect.New(t)
i, _ := b.Interface().(I)
i.SetSelf(i)

fmt.Println("----- invoke 'Method' via 'Call'. -----")
i.Call()
fmt.Println("----- invoke direct 'Method'. -----")
i.Method(i)
}

/*
----- invoke 'Method' via 'Call'. -----
name: B
<main.A Value>
<int Value>
<float32 Value>
<bool Value>
----- invoke direct 'Method'. -----
name: B
<main.A Value>
<int Value>
<float32 Value>
<bool Value>
*/

· 2 min read

ある構造体のフィールドを得ようと実装したら、なぜか継承元(Goではこう言わないか)のフィールドしか取得できなかった。 構造体を引数に実行すれば取得できるけど、同じメソッドを呼んでいるのだが…。

これはどう理解したらいいのかわからない。

http://play.golang.org/p/KcfBp2myhR
package main

import (
"fmt"
"reflect"
)

type I interface {
Call()
Method(interface{})
}

type A struct {
a1 bool
}

func (a *A) Call() {
a.Method(a)
}

func (a *A) Method(i interface{}) {
ip := reflect.ValueOf(i)
iv := ip.Elem()
fmt.Println("name:", iv.Type().Name())
for ii := 0; ii < iv.NumField(); ii++ {
fmt.Println(iv.Field(ii))
}
}


type B struct {
A
b1 int
b2 float32
b3 bool
}

func main() {
var bi interface{}
bi = &B{}
t := reflect.TypeOf(bi).Elem()
b := reflect.New(t)
i, _ := b.Interface().(I)

fmt.Println("----- invoke 'Method' via 'Call'. -----")
i.Call()
fmt.Println("----- invoke direct 'Method'. -----")
i.Method(i)
}

/*
----- invoke 'Method' via 'Call'. -----
name: A
&lt;bool Value&gt;
----- invoke direct 'Method'. -----
name: B
&lt;main.A Value&gt;
&lt;int Value&gt;
&lt;float32 Value&gt;
&lt;bool Value&gt;
*/

· 2 min read

Goは色々と今までの言語と異なり、慣れるのに一苦労なんじゃないか?と思いつつも、コンセプトは結構好き。 そんな言語だけど、こういう初歩的なところで悩むことが多い。

go func

さぁ、どっちがいいのか?

無名関数として実行している。

i := 3
var result int
func() {
result = i * 10
}()

goroutineとして実行している。

i := 3
c := make(chan int)
var result int
go func() {
result = i * 10
c<- 1
}()
<-c

どっちがいいというか、こういう書き方ができるというサンプルであって、

  • 処理を明示したいなら前者
  • そっちの処理をさせつつ、そのまま別の処理もしたい場合は後者

って使い分けなのかなぁ?と思っている。

前者はこうすべきなのでは?と思ったり。

i := 3
result := func() (result int) {
result = i * 10
return
}()

まとめ

こういう作法とか使い分けを知りたい。

· 2 min read

herokuでもGoが動くし、NITROUS.IO(https://www.nitrous.io/)でもGoが動くということで、最近のWebアプリに必要そうなOAuthについて調べてみた。
調べたというか、ライブラリを使ってどれくらいお手軽に出来るか確認した程度。

ほぼこのまんま

■ GoLang Tutorials: OAuth2: 3-legged authorization in a Go web application
http://golangtutorials.blogspot.jp/2011/11/oauth2-3-legged-authorization-in-go-web.html

このページを参考に試した。
認証に使うClient IDとClient secretを自分のものに置き換え、一部コードを修正した。
Client IDを登録してない場合は下記URLから API Access を辿り登録しておく必要がある。
https://code.google.com/apis/console/
Client ID登録時にコールバック用のURLも指定する必要があり、ページ内では Redirect URIs という表記になっている。

ソースコード

go get code.google.com/p/goauth2/oauth

を実行後に下記ソースコードをコンパイル、実行する。

cd main go build main.go ./main.go

ブラウザで http://localhost:3000/ にアクセス。