Go 함수 및 패키지 써보기
2019-02-09 23:35:10

함수

1
2
3
4
5
6
7
8
9
10
11
package main
import "fmt"

func main() {
first := "hello world!"
message(first)
}

func message(msg string) { // 매개변수에는 자료형을 붙여야 함.
fmt.Println(msg) // hello world!
}

가변인자도 지원, 슬라이스로 넘어 온다.

1
2
3
4
5
6
7
8
9
10
11
12
package main
import "fmt"

func main() {
manyParamter("go", "C++", "javascript", "python")
}

func manyParamter(_param ...string) { // ... 붙인다.
for _, item := range _param {
fmt.Println(item)
}
}

리턴 시에도 자료형을 명시해야 함.

1
2
3
4
5
6
7
8
9
10
package main
import "fmt"

func main() {
fmt.Println(returnMessage("hi golang?"))
}

func returnMessage(msg string) string { // 이런식으로 인자 ) 닫고 추가.
return msg
}

다중 리턴도 지원함.

1
2
3
4
5
6
7
8
9
10
package main
import "fmt"

func main() {
fmt.Println(returnMessages("golang", "node.js", "JAVA"))
}

func returnMessages(msg ...string) (string, string, int) {
return msg[0], msg[1], 20190209
}

go는 포인터가 잇으니 파라미터에 주소값을 넣을 수 잇음.

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import "fmt"

func main() {
a := "왼손은 거들뿐.."
pointerMessage(&a)
fmt.Println(a) // 오른손은 ?이 출력된다. 변수 값이 바뀌엇으니깐.
}

func pointerMessage(msg *string) { // 포인터일 경우에는 * 붙여줘야 함.
fmt.Println(*msg) // 주소에 할당된 값을 출력.
*msg = "오른손은 ?"
}

익명함수 작성법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
import "fmt"

func main() {

/*
자바스크립트인 경우.
const af = (_param) -> {
return _param
}
*/
af := func(param string) string {
return param
}

fmt.Println(af("hello world"))
}

패키지

go에선 모듈을 패키지라 부르는 거 같음.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package timepackage // 이 파일이 포함된 폴더명으로 지어줘야한다.

import (
"strconv"
"time"
)

/*
사용자 정의 패키지.
init 함수부터 만드러야 한다.
init 함수는 패키지가 로드 되면서 실행되는 함수로 별도의 호출 업이 자동으로 호출.
*/

var myTime map[string]string

func init() {
myTime = make(map[string]string) // 초기화.
thisTime := time.Now() // JS에서 쓰는 Date.now() 같다고 생각하면 됨.
myTime["now"] = thisTime.String() // time.now만 (타임 객체) .String()으로 문자열로 변환가능하다.
myTime["yyyy-mm-dd"] = thisTime.Format("2006-01-02") // 원하는 포맷의 날짜는 임의가 아니고 저 날짜로 -_-
myTime["yyyy-mm-dd HH:MM:SS"] = thisTime.Format("2006-01-02 15:04:05") // 시간 분도 마찬가지다.
/*
int64는 string으로 변환할 때 FormatInt를 사용해야 한다
Itoa로는 안됨.

FormatInt(숫자, 진수) 10은 10진수로 16은 16진수로.
*/
myTime["unixTimeStamp"] = strconv.FormatInt(thisTime.Unix(), 10)
myTime["unixTimeStampNS"] = strconv.FormatInt(thisTime.UnixNano(), 10) // MS가 아닌 나노
}

/*
퍼블릭이면 함수시작을 대문자로
프라이빗이면 소문자 (외부에서 못 부름)
*/

func GetMyTime() map[string]string {
return myTime
}

패키지에서 함수를 만들 때 대문자로 시작하면 퍼블릭, 소문자면 프라이빗

작성한 패키지를 불러오려면 다음처럼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
"mypackage/timepackage" // import할 땐 폴더 경로만 적어주면 된다.
)

func main() {
res := timepackage.GetMyTime() // 이런식으로.. 알아서 매핑이 되나보오.

fmt.Println(res)

/* 결과
map[yyyy-mm-dd HH:MM:SS:2019-02-09 23:50:47
unixTimeStamp:1549723847
unixTimeStampNS:1549723847110405686
now:2019-02-09 23:50:47.110405686 +0900 KST m=+0.000601933
yyyy-mm-dd:2019-02-09]
*/
}

오늘은 요까지.

Prev
2019-02-09 23:35:10
Next