はじめに
長年JAVAをやってきました。JAVAと比較してGoでは便利だと思うのは、まず2点があります。
・変数の値交換
・関数に複数戻り値の定義可能
変数の値交換
JAVA例
int a = 10;
int b = 20;
// 一時変数が必要です。
int temp = a;
a = b;
b = temp
Go例
a := 10
b := 20
// 値交換:一時変数不要。バブルソート (bubble sort) の交換処理など
a, b = b, a
変数は減らすことでコードは見やすくなります。
JAVAでは関数の戻り値について
戻り値がない場合
private void doSomething() {
// return句省略可
}
戻り値がある場合
private String getSomething() {
// return句が必須
return "xxx";
}
戻りは一回一つしか設定できません。複数戻りたい時はArray、List、Map、INFOクラス作成するなどが必要です。
Goの関数の戻りについて
戻り値がない場合 ※戻り値関連記載不要
func doSomething() {
// doSomething
}
一つ戻り値の場合: 戻りの型だけ定義
func main() {
result := doSomething()
fmt.Println(result)
}
func doSomething() string {
// doSomething
return "テストです"
}
一つ戻り値の場合: 戻りの型と変数名両方定義
func main() {
result := doSomething()
fmt.Println(result)
}
func doSomething() (result string) {
// doSomething
result = "テストです"
return
}
複数戻り値の場合: 戻りの型だけ定義
func main() {
userName, age, gender := doSomething()
fmt.Println(userName, age, gender)
}
func doSomething() (string, int, bool) {
// doSomething
return "田中", 20, true
}
複数戻り値の場合: 戻りの型と変数名両方定義
func main() {
userName, age, gender := doSomething()
fmt.Println(userName, age, gender)
}
func doSomething() (userName string, age int, gender bool) {
// doSomething
userName = "田中"
age = 20
gender = true
return
}
また、複数戻りに対して「_」で戻り値が使わないようにするという書き方は便利です。
userName, age, _ := doSomething()
例えば、JAVAのMapに値を取得する際に、キーの存在しない場合、値はnullの場合は区別できないため、
それぞれのメソッドを利用する必要あります。
存在チェック例:map.containsKey("userName")
値取得例: map.get("userName")
よくあるMapからの取得サンプルコード:
String userName = "";
if (map.containsKey("userName")) {
userName = map.get("userName")
}
Goの場合は、同時に存在チェックの結果を帰ってくるので、便利です。
func main() {
m := map[string]string{"user1": "1", "user2": "2"}
value, ok := m["user1"]
// 存在する場合はok=true 存在しない場合はok=false
fmt.Println(value, ok)
}
Goの便利なところの一例でした。
以上