- パッケージ内に定義した関数を外部に公開するにはどうすれば良いか?
- 非同期に処理を行う為の命令は?
- 関数を抜けた際に処理を実行するにはどうするか?
- goroutineの同時実行数を変更するにはどうするか?
- コンパイラやリンカが8g/6g/5g、8l/6l/5lという名前になっている理由は?
- Goのガベージコレクションの実装は一般的に何と呼ばれている類か?
- レシーバがnilの場合にメソッドを呼び出すと何が起きるか?
- 可変個引数はどの様に定義するか?
- 関数内で定義されるローカル変数のアドレスを戻り値として外部から参照するとどうなるか?
- interfaceとstructの違いは何か?
- panicを補足して強制終了させない為にはどうするか?
2011/03/08
Goプログラマであるかを見分ける10の質問
下記質問にそれぞれ50文字以内を目安に簡単に説明すること。
2011/03/06
最近のjavaコンパイラはconstなStringを結合して最適化...しない
public class foo {
final static String bar = "a" + "b";
public foo() { }
public String bar(String baz) {
return "a" + "b" + baz + "c" + "d";
}
}
コンパイルしてデコンパイル
# javac -version
javac 1.6.0_24
# javac foo.java
# jad foo.class
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name: foo.java
public class foo
{
public foo()
{
}
public String bar(String s)
{
return (new StringBuilder()).append("ab").append(s).append("c").append("d").toString();
}
static final String bar = "ab";
}
+ をStringBuilder に置き換えてくれたまでは良かった。a と b は最適化されて一つの ab になったけど c と d はそのままだ。この最適化が有効なのは、業務のソースなんかでたまに見かける
String sql = "SELECT "
+ " * "
+ " FROM "
+ " USER_MST"
+ " WHERE "
+ " BAR = ?";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, "baz");
こんなソースの場合だと思うんだけど、テーブル名なんかを変数に持ってて
String sql = "SELECT "
+ " * "
+ " FROM "
+ " " + tableName
+ " WHERE "
+ " BAR = ?";
こんな事しちゃうと、変数以降の最適化が StringBuilder での最適化に止まってしまう。まぁよく見るよね。こういうコード。
String s1 = (new StringBuilder()).append("SELECT * FROM ").append(s).append(" WHERE ").append(" BAR = ?").toString();
PreparedStatement preparedstatement = connection.prepareStatement(s1);
preparedstatement.setString(1, "baz");
しばらく「最近のJavaはconstなStringを結合して最適化する」っていうのはやめておこうと思った。go-gtkがWindowsで動いた。
この時をずっとまってた。
Google製の新しいコンパイル型言語Go上で動くGTK GUIライブラリ、go-gtkが今日、windowsで動いた。
Xming上で動いている様にも見えますが、ちゃんとwin32 nativeなGTKで動いてます。
まずは一般的なGUIのサンプル。
だいたい動きました。ここ数日、cgoのwin32対応に関するsubmitが多くなってたので、そろそろ動くかなと思って着手しました。win32向けに対応した部分としては実はそんなに多くないです。go-gtkはイベントポーリングを自前でやっていて、その排他制御にpthreadを使っているんですが、win32だとpthread_mutex_lock/pthread_mutex_unlockでうまく排他制御出来なかった(gdkのスレッドと相性が良くないのか落ちる)ので、win32ではクリティカルセクションを使う様にお得意の#ifdefで修正しました。
gtksourceviewの一部で落ちるのを1件確認してますが、その他はほぼ動きました。
GUIが扱えるスクリプト言語は数ありますが、nativeにコンパイル出来てオブジェクト思考で、非同期(goroutine)が使えるGoでGUIライブラリがwindows上で動いたのは、正直大きいと個人的には思っています。
Goの高速なコンパイルと、Duck Typingによる自由度の高い型変換により脳内で設計した物が思考停止する事なくアウトプット出来るのです。
同じコードで比べないと比較になりませんが、C言語でcurlとgtkを使ってtwitterのpublic timelineをGUI表示(アイコン表示あり)というコードがあったとして、僕のノートPC(Intel Core i5)ではコンパイル/リンクがだいたい5秒程度くらいかかりますが、go-gtkの同等サンプルexample/twitterだと2秒くらいでビルド出来ます。
これからGoでGUIを使ったアプリケーションを作りたいという方にはぜひ試して欲しいと思います。
Goがwindowsで動き出してまだホヤホヤですが、これから普及していく事を望んでます。
Google製の新しいコンパイル型言語Go上で動くGTK GUIライブラリ、go-gtkが今日、windowsで動いた。
Xming上で動いている様にも見えますが、ちゃんとwin32 nativeなGTKで動いてます。
まずは一般的なGUIのサンプル。
そしてgoroutineで非同期にtwitter public timeline(非streaming API)を読み込むサンプル。
だいたい動きました。ここ数日、cgoのwin32対応に関するsubmitが多くなってたので、そろそろ動くかなと思って着手しました。win32向けに対応した部分としては実はそんなに多くないです。go-gtkはイベントポーリングを自前でやっていて、その排他制御にpthreadを使っているんですが、win32だとpthread_mutex_lock/pthread_mutex_unlockでうまく排他制御出来なかった(gdkのスレッドと相性が良くないのか落ちる)ので、win32ではクリティカルセクションを使う様に
gtksourceviewの一部で落ちるのを1件確認してますが、その他はほぼ動きました。
GUIが扱えるスクリプト言語は数ありますが、nativeにコンパイル出来てオブジェクト思考で、非同期(goroutine)が使えるGoでGUIライブラリがwindows上で動いたのは、正直大きいと個人的には思っています。
Goの高速なコンパイルと、Duck Typingによる自由度の高い型変換により脳内で設計した物が思考停止する事なくアウトプット出来るのです。
同じコードで比べないと比較になりませんが、C言語でcurlとgtkを使ってtwitterのpublic timelineをGUI表示(アイコン表示あり)というコードがあったとして、僕のノートPC(Intel Core i5)ではコンパイル/リンクがだいたい5秒程度くらいかかりますが、go-gtkの同等サンプルexample/twitterだと2秒くらいでビルド出来ます。
これからGoでGUIを使ったアプリケーションを作りたいという方にはぜひ試して欲しいと思います。
Goがwindowsで動き出してまだホヤホヤですが、これから普及していく事を望んでます。