Golang 다양한 함수 유틸리티 go-funk 라이브러리 알아보기 1
오늘은 Golang으로 map, find, contains, filter, chunk, reverse와 같은 여러 함수들을 지원하는 go-funk 라이브러리를 알아보려 합니다.
go-funk 설치
우선 Golang의 환경을 구성하기 위해 https://golang.org/dl/ 에서 윈도우, 리눅스, 맥에서 설치 프로그램을 내려받을 수 있습니다.
맥에서 brew로 쉽게 설치할 수 있습니다.
brew install go
우분투에서도 apt로 쉽게 설치할 수 있습니다.
sudo apt-get install golang-go
맥에서 Golang의 버전을 올리려면 brew를 이용합니다.
brew upgrade go
우분투에서도 Golang의 버전을 올리려면 backports 저장소를 등록하고 apt를 이용합니다.
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt-get update
sudo apt-get install golang-go
go get으로 go-funk 패키지를 설치합니다.
go get github.com/thoas/go-funk
홈의 go 폴더에 go-funk 소스코드와 패키지 파일이 생성됩니다.
예제
package main
해당 소스코드를 실행 파일로 인식하게 해주도록 main이라고 선언합니다.
import (
"fmt"
"github.com/thoas/go-funk"
)
fmt와 go-funk를 가져옵니다.
type test struct {
ID int
Password string
}
구조체를 만들어둡니다.
func main() {
contains := funk.Contains([]string{"hello", "world"}, "hello")
fmt.Println(contains)
Contains 함수로 특정 문자열이 포함되었는지 확인할 수 있습니다.
testStruct := &test{
ID: 1,
Password: "0000",
}
contains = funk.Contains([]*test{testStruct}, testStruct)
fmt.Println(contains)
contains = funk.Contains([]*test{testStruct}, nil)
fmt.Println(contains)
Contains 함수로 구조체가 포함되었는지 확인할 수 있습니다.
testStruct2 := &test{
ID: 2,
Password: "1111",
}
get := funk.Get(testStruct2, "ID")
fmt.Println(get)
구조체의 경로에 있는 값을 가져올 수 있습니다.
contains = funk.Contains([]*test{testStruct}, testStruct2)
fmt.Println(contains)
새로 만든 객체로 포함되었는 지 확인할 수 있습니다.
contains = funk.Contains("hello", "lo")
fmt.Println(contains)
contains = funk.Contains("hello", "world")
fmt.Println(contains)
문자열에서도 일부 문자가 포함되었는 지 확인할 수 있습니다.
contains = funk.Contains(map[int]string{1: "test"}, 1)
fmt.Println(contains)
맵으로도 포함되었는 지 확인할 수 있습니다.
indexOf := funk.IndexOf([]string{"hello", "world"}, "hello")
fmt.Println(indexOf)
indexOf = funk.IndexOf([]string{"hello", "world"}, "test")
fmt.Println(indexOf)
IndexOf로 어느 인덱스에 존재하는 지 확인할 수 있습니다.
만약 존재하지 않는다면 -1을 출력합니다.
indexOf = funk.LastIndexOf([]string{"hello", "hello", "world"}, "hello")
fmt.Println(indexOf)
indexOf = funk.LastIndexOf([]string{"hello", "world"}, "test")
fmt.Println(indexOf)
LastIndexOf로 일치하는 마지막 인덱스를 확인할 수 있습니다.
results := []*test{testStruct, testStruct2}
mapping := funk.ToMap(results, "ID")
fmt.Println(mapping)
ToMap으로 특정 키를 기반으로 객체를 map 변환할 수 있습니다.
filter := funk.Filter([]int{1, 2, 3, 4}, func(x int) bool {
return x%2 == 0
})
fmt.Println(filter)
Filter로 원하는 조건에 일치하는 값들을 반환할 수 있습니다.
find := funk.Find([]int{1, 2, 3, 4}, func(x int) bool {
return x%2 == 0
})
fmt.Println(find)
Find로 왼쪽부터 순서대로 조건에 맞는 값을 찾아서 반환할 수 있습니다.
intMap := funk.Map([]int{1, 2, 3, 4}, func(x int) int {
return x * 2
})
fmt.Println(intMap)
stringMap := funk.Map([]int{1, 2, 3, 4}, func(x int) string {
return "Hello"
})
fmt.Println(stringMap)
intMap = funk.Map([]int{1, 2, 3, 4}, func(x int) (int, int) {
return x, x
})
fmt.Println(intMap)
Map으로 반복 가능한 값에서 모든 요소를 원하는 값들로 변환할 수 있습니다.
mapping = map[int]string{
1: "hello",
2: "world",
}
intMap = funk.Map(mapping, func(k int, v string) int {
return k
})
fmt.Println(intMap)
stringMap = funk.Map(mapping, func(k int, v string) (string, string) {
return fmt.Sprintf("%d", k), v
})
fmt.Println(stringMap)
}
Map으로 map을 변형시킬 수 있습니다.
내일 다음 포스트가 업로드됩니다.