Go language part 1at TECH
Go language part 1 - 暇つぶし2ch1001:デフォルトの名無しさん
17/11/11 15:36:08.28 proXGFSN.net
>>985
>動的言語の場合は既に言われているようにスキーマ管理が一元化出来る
>(正確にはやらなくてもそのまま動くだけだが)
> 分だけ書く量は少なくて済む。
> プロトタイピングには動的言語の方が向いてる。
同意する。Goでデータベース操作の決定版がでないのが物語ってる。
逆にGAE/goのdatastoreを使うときはGoとの相性の良さを感じる。
スキーマがGo側に設定することが決まっているから。

1002:あ
17/11/11 15:56:16.25 X8lWnCzG.net
>>985
まー、確かに。
正直すぐ死ぬプログラムならメモリ管理もしない()という選択肢もあるわけだしな。
外の世界と相性の悪い言語だと言うことは確か。
形が適当なjsonとかとも同様にいちいちキャストがしちめんどくさいし。
c#で言うdynamicみたいな型がありゃ良いなとは思うが、コンパイル時に解決してる事を善とするので無いのは仕方ない。向いてないわ。

1003:デフォルトの名無しさん
17/11/11 16:18:54.52 LLMRc4SD.net
というか、これはAPIが足りてないんだね。
(以下コードは文法があやふやなので参考程度で)
database/sqlはScanを使うのが定番のようだが、Scanではargsの可変長指定しかないのがいけない。
だから構造体の中身を確認するのにリフレクションが必要になってしまう。
type Thread struct {
no int
time int
body string
}
th := Thread{}
rows, err := db.Query("SELECT * from threads;")
err = rows.Scan(&th.no, &th.time, &th.body) // ここでばらすから中身を知らないといけない
とりあえずScanが構造体を受け、その構造体にScannerインタフェースを実装する方式なら、
リフレクションは回避出来るし、おそらく最高速度で動く。
ただ、このためのAPIがない。
err = rows.Scan(&th) // ばらさずに構造体を与える
func (th Thread) Scan(src interface{}) err // 各構造体でばらす。手間は増えるが最速


1004:のはず DBを生で叩いたことがないから知らないが、DBからの出力が既に配列なのか? 或いは同様のことはポインタ配列で受ければいいので割り切ったか。(972参照) >>986 GAE/Goはググってみたがよく分からん。 ただ今回はCREATE TABLE部分も自前で持つ為、スキーマ管理はGo側でも「本来は」出来る。 SQLの構造上、CREATE TABLE と INSERT はほぼ同じなのでPHP等ではSQL文字列を共有出来る。 だから1箇所にしか書かずに済んでた。ところがGoはリード側も必要だからぐぬぬ、ってなってる。



1005:デフォルトの名無しさん
17/11/11 16:29:51.83 LLMRc4SD.net
>>987
お前他スレも荒らしてた荒らしだろ。
この程度のプログラムで「メモリ管理(キリッ」とか言っちゃう時点でお前はCを知らないし、
お前みたいな馬鹿にはCは無理だ。
それで何故Cに話を振る?だれもCで実装しようともしてないのに。
普通にCが出来る奴なら鯖でDB読んでJSON返すだけのプログラムでリークはしないし、
リークしないように管理する(程のこともないが)に苦労することもない。
そもそもそれはGoで書いた時にGCがどこで動くか見えていれば分かる


1006:はず。 君はそこにも達していない。



1007:デフォルトの名無しさん
17/11/11 17:10:37.92 ZUnF3Lay.net
うめようず

1008:デフォルトの名無しさん
17/11/11 17:56:09.07 LLMRc4SD.net
というか void* がないのね。
これではどうやっても fetch_all で隠蔽出来そうにない。
まあ void* なんて認めたら型システムは崩壊するから致し方無しか。
そしていきなりunsafeに手を出そうかと考えているわけだが、
これって Offsetofがあるって事は基本的にはマーシャル用なのかな?

1009:あ
17/11/11 18:53:30.76 X8lWnCzG.net
>>989
荒らしじゃないよ。
真面目に話してるが、仮定に対して仮定したら切れるって意味わからん。

1010:あ
17/11/11 18:58:21.35 X8lWnCzG.net
>>989
まさか、
>>983の、ノリがC、C出身だからついてける、に対して
「ならCで書けば?でもめんどくさいと思うけど。」って嫌味だって気づいてないんだろうか?
可哀想な人ってどこにでも居るんだな。
Gcが動くタイミングに関しては、多分もう少しマシなレベルで知ってると思うけど。
そもそも、CでDBから取得してどうの、と言う話で、何を使うかどう取得するかすら決まってないのに、リークしないようにメモリ管理するなんて絵空事は言えんだろ。
全部インハウスライブラリならわかるけどさ。
メモリ管理しない、は思いつきでも言えるわ(笑)

1011:あ
17/11/11 18:59:31.42 X8lWnCzG.net
嫌味が荒らしになるとは、ネットは京都より平和な場所になったんだなぁ。

1012:あ
17/11/11 19:03:39.05 X8lWnCzG.net
よく読んだら>>981で同じ事言われてるのにドヤ顔で返事してるし、本気でそうなんだろうな。
void* をどう使いたいかによるだろうが、それこそ*interface{}じゃねえの?と思ってしまう。

1013:デフォルトの名無しさん
17/11/11 19:16:58.98 TpLoCFAx.net
次スレよろ

1014:あ
17/11/11 19:23:54.10 X8lWnCzG.net
まあ、要らないカラムが多すぎるだけなら、
row,err:=sql.Queryで、
column,err:=row.Columns()
vals:=Make([]sql.RawBytes,len(column))
args:=Make([]interface,len(column))
for i:= range values {
 args[i]=&vals[i]
}
でvalsとargsつくって、
Scanに(args...)で渡せば、
使うときにvals[i]をstring(vals[i])とかよしなにしちゃえるんじゃないの?

1015:デフォルトの名無しさん
17/11/11 19:26:08.40 LLMRc4SD.net
>>993
日本語でおk
君と話が噛み合わないのは、君が勝手に読み違えているから。
それは君の日本語能力が不十分だから。
だから君は荒らしなんだよ。
俺は他スレで君が同様に空回りしてるのを見たことがある、というだけ。
君には荒らすつもりはないのだろう、それは事実としても、
日本語能力が足りない奴がレスすること自体が荒らし行為なんだよ。
馬鹿なら馬鹿なりに何度でも読み返せばいいだけなんだがな。
韓国人ならマジで死んでくれ。

>>996
おk。>>46見る限り次スレはpart6(このスレがpart5相当)でいいか?
8時まで待って異議なしなら俺が建ててみる。
異議ありならその人が建てて。

1016:あ
17/11/11 19:26:19.52 X8lWnCzG.net
Go language part 2
スレリンク(tech板)
あんまり立てないから間違ってたらごめん。

1017:あ
17/11/11 19:26:34.95 X8lWnCzG.net
>>998
ごめん、勢いで建てた。

1018:あ
17/11/11 19:27:10.90 X8lWnCzG.net
>>998
バカはバカなりに何度も読み返してくれれば、嫌味にも気がついだだろうに。悲しいなぁ。

1019:あ
17/11/11 19:34:53.44 X8lWnCzG.net
まあ、可変長受ける関数に実体を指すinterfaceの参照のスライスを...で渡せるのはと割と便利。

1020:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1493日 7時間 30分 2秒

1021:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch