Help us understand the problem. What is going on with this article?

GoでScalaっぽくコレクション操作できるメソッドを作ってみる。

More than 1 year has passed since last update.

ただの集団 Advent Calendar 2018の14日目です。
昨日は、takahiro.haginoさんのauto-join-overviewでした。
私は、一応このアドベントカレンダーの発起人ですが、ランダム関数により、14日目という貴重な日程を頂きました😉
ただの集団のイチローさんのおかげで素敵なメンバーが集まってくれました🙏

はじめに

プログラミングを始めてから、一番長い間触れてきていたのがScalaだった私ですが、業務で新しいアプリケーションの作成の際にGo言語を採用することになりました。
Goを書いていても、Scalaのように簡単に、配列(正確にはスライス)の操作がしたいと思ったことがきっかけでこの記事を書いています。

欲しいと思ったメソッドをScalaと比較しつつ羅列して行きます💪

gotour

簡単にGo言語の動作確認をしたい時におすすめのwebサービスです。ただ、サーバーが混み合うことがあるので、OSS版の方をgetすることをおすすめします!
https://github.com/atotto/go-tour-jp

$ go get github.com/atotto/go-tour-jp/gotour
$ gotour

map

今回はmapMethodとして実装。(mapは予約語だった)

map.scala
val list: Seq[Int] = Seq(1, 2, 3, 4, 5)
val mapedList = list.map(_ * 2)
println(mapedList)
// 出力: Seq(2, 4, 6, 8, 10)
mapFunction.go
package main
import "fmt"

type anyList []int
func main() {
    var numberList anyList = []int{1, 2, 3, 4, 5}
    mapedList := numberList.mapMethod(func(i int) int {
        return i * 2
    })
    fmt.Println(mapedList)
}

func (list anyList) mapMethod(f func(int) int) anyList {
    var acc anyList
    for _, l := range list {
        acc = append(acc, f(l))
    }
    return acc
}
// output: [2 4 6 8 10]

filter

filter.scala
val list: Seq[Int] = Seq(1, 2, 3, 4, 5)
val filteredList = list.filter(_ % 2 == 0)
println(filteredList)
// output: Seq(2, 4)
filter.go
package main
import "fmt"

type anyList []int
func main() {
    var numberList anyList = []int{1, 2, 3, 4, 5}
    filteredList := numberList.filter(func(i int) bool {
        return i % 2 == 0
    })
    fmt.Println(filteredList)
}

func (list anyList) filter(f func(int) bool) anyList {
    var acc anyList
    for _, l := range list {
        if f(l) {
            acc = append(acc, l)
        } 
    }
    return acc
}
// output: [2 4]

contains

contains.scala
val list: Seq[Int] = Seq(1, 2, 3, 4, 5)
val isTwo = list.contains(2)
val isOneHundred = list.contains(100)
if (isTwo) {
     println("このリストには、2が含まれています。")
 } else {
     println("このリストには、2が含まれていません。")
 }
 if (isOneHundred) {
     println("このリストには、100が含まれています。")
 } else {
     println("このリストには、100が含まれていません。")
 }

 /** output:
このリストには、2が含まれています。
このリストには、100が含まれていません。
*/
contains.go
package main
import "fmt"

type anyList []int
func main() {
    var numberList anyList = []int{1, 2, 3, 4, 5}
    if numberList.contains(2) {
        fmt.Println("このリストには、2が含まれています。")
    } else {
        fmt.Println("このリストには、2が含まれていません。")
    }
    if numberList.contains(100) {
        fmt.Println("このリストには、100が含まれています。")
    } else {
        fmt.Println("このリストには、100が含まれていません。")
    }
}

func (list anyList) contains(target int) bool {
    for _, n := range list {
        if n == target {
            return true
        } 
    }
    return false
}

/** output:
このリストには、2が含まれています。
このリストには、100が含まれていません。
*/

exists

exists.scala
val list: Seq[Int] = Seq(1, 2, 3, 4, 5)
val hasEvenNumber = list.exists(_ % 2 == 0)
if (hasEvenNumber) {
    println("numberLisrは偶数を含んでいます。")
} else {
    println("numberListは偶数を含んでいません。")
}
// output: numberLisrは偶数を含んでいます。
exists.go
package main
import "fmt"
type anyList []int
func main() {
    var numberList anyList = []int{1, 2, 3, 4, 5}
    hasEvenNumber := numberList.exists(func(i int) bool {
        return i % 2 == 0
    })
    if hasEvenNumber {
        fmt.Printf("numberListは偶数を含んでいます。")
    } else {
        fmt.Printf("numberListは偶数を含んでいません。")
    }
}

func (list anyList) exists(f func(int) bool) bool {
    for _, l := range list {
        if f(l) {
            return true
        } 
    }
    return false
}
// output: numberLisrは偶数を含んでいます。

まとめ

それぞれの言語にはその言語の良さがあります。今回はそこを無視して、自分の書きたいようにかけるかの挑戦でした。非常に楽しかったです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away