๐ก ๋ค์ด๊ฐ๊ธฐ์ ์์, ์ด ๊ธ์ go์ ๋ฌธ๋ฒ์ ์ ๋ฆฌํ ๊ฒ์ด์ง ์ธ์ด๋ฅผ ์ฒ์ ๋ฐฐ์ฐ๋ ์ฌ๋์ ์ํ ๊ธ์ด ์๋์ ๋ฐํ๋๋ค! ๋ณ์ GoLang์ ๋ณ์๋ ํฌ๊ฒ 2๊ฐ์ง const(์์), var(๋ณ์)๋ก ์ด๋ฃจ์ด์ง๋ค.
constconst name string = โSanbalโ
varvar name string = โSanbalโ
name := โStringโ
์์ ๊ฐ์ด ์์ฑํ๋ฉด, Go๊ฐ ํ์
์ถ๋ก ์ ํตํด์ ํ์
์ด ์ง์ ๋๋ค. :=
์ ์ธ๋ ํ์
์ด ์ง์ ๋๊ธฐ ๋๋ฌธ์ ๋์ค์ ๋ค๋ฅธ type์ ๋ฃ์ ์ ์๋ค. Function 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
// ๊ธฐ๋ณธ์ ์ธ function์ ํํ
func len ( name string ) int {
return len ( name )
}
// ์
๋ ฅ์ ์ฌ๋ฌ๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ
func words ( words ... string ) {
// ์
๋ ฅ๋ฐ์ ๊ฐ์ list ํํ๋ก ๋ํ๋ธ๋ค.
fmt . Println ( words )
}
// ๋ฐํ์ ์ฌ๋ฌ๊ฐํ๋ ๊ฒฝ์ฐ, python์ฒ๋ผ ๊ฐ๋ฅํ๋ค.
func lenAndUpper ( name string ) ( int , string ) {
return len ( name ), strings . ToUpper ( name )
}
// -> namelen, up := lenAndUpper('sanbal')
// naked func
// ๋ฏธ๋ฆฌ ๋ฐํํ ๋ณ์๋ฅผ ์ง์ ํด return๋ ๋ ํด๋น ๋ณ์๋ฅผ ๋ฐํํ๋ค.
func naked ( name string ) ( lenght int , uppercase string ) {
// ์์์ ์ด๋ฏธ ๋ณ์๊ฐ ํ ๋น๋ฌ์ผ๋๊น :=์ ๊ฐ์ ์์ ์ฐ์ง ์๋๋ก ํ์!
lenght = len ( name )
uppercase = strings . ToUpper ( name )
return
// return lenght, uppercase ํด๋ ์๊ด์ ์์!
}
defer ํจ์๊ฐ ์ข
๋ฃ๋๋ฉด ์คํ๋๋ ๋ช
๋ น์ด
return์ด ๋ฐ์ํ๊ณ ๋ ๋ค์ ์คํ๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์์ ๊ฝค ์ ์ฉํ๊ฒ ์ฐ์ผ ๋ฏํ๋ค! 1
2
3
4
5
6
7
func naked ( name string ) ( lenght int , uppercase string ) {
defer fmt . Println ( "I'm done!" )
lenght = len ( name )
uppercase = strings . ToUpper ( name )
return
}
๋ฐ๋ณต๋ฌธ For Go์์ ๋ฐ๋ณต๋ฌธ์ for ํ๋๋ฟ์ด๋ค. map, forEach์ ๊ฐ์ ๊ธฐ๋ฅ์ ์๊ณ ๋ฑ for๋ง~~(์ฌํํด์ ์คํ๋ ค ์น์ํด)~~
for๋ฌธ์ ์ํด์ range
๊ฐ ์๋๋ฐ python์์ enumerate() ๊ฐ์ ๋๋์ผ๋ก ์๋ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func superAdd ( numbers ... int ) int {
total := 0
// range๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
for i , number := range numbers {
total += number
}
// ์์๊ฐ์ด ์ฐ๋ฉด i์ ๋นจ๊ฐ์ค์ด ์๊ธฐ๋๋ฐ, ์ฌ์ฉํ์ง ์๋ ๋ณ์๊ฐ ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋๋ค;;;;;
// ๊ทธ๋์ _๋ฅผ ์ด์ฉํด์ ๋ฌด์ํด๋ฒ๋ฆด ์ ์์! (python์์๋ _๋ฅผ ๋ณ์๋ก ์ฐ๋ ๋ช
์์ ์ธ ๋๋์ด์๋๋ฐ, ์๋ ์ง์ง๋ก ๋ชป์ด๋ค;;;)
for _ , number := range numbers {
total += number
}
// ๋ฌผ๋ก ์ ํต์ ์ธ ๋ฐฉ์๋ ์ง์ํ๋ค.
for i := 0 ; i < len ( numbers ); i ++ {
fmt . Println ( i , numbers [ i ])
}
return total
}
์กฐ๊ฑด๋ฌธ if else if else if else๋ ๋ญ…์ฌํํ๋ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func canIDrink ( age int ) bool {
/*
if age < 18 {
return false
} else {
return true
}
*/
// ๊ทผ๋ฐ ์์๊ฐ์ด ์ฐ๋ ๊ฒ๋ณด๋จ ์ด๊ฒ ๋ ์ฟจ, ํ, ์น์ํ๊ธฐ๋ ํ๊ณ vscode์์ extension์ผ๋ก ์ถ์ฒํด์ค๋ค.
if age < 18 {
return false
}
return true
}
Switch python์ ์๊ณ , C์์ ์จ๋ณธ ์ดํ๋ก ์ ๋ง ์ค๋๋ง์ธ๋ฐ ๊ฐ๋ ํ์ํ ์ผ์ด ์๊ธด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func canIDrink ( age int ) bool {
// ์กฐ๊ฑด์ด ๊ฑธ๋ฆฌ๋ ๋ณ์๋ฅผ ์ง์ ํ๊ฑฐ๋
switch age {
case 10 :
return false
case 18 :
return true
}
// ์กฐ๊ฑด์ ๋ช
์ํ๊ฑฐ๋
switch {
case age < 18 :
return false
case age == 18 :
return true
case age > 50 :
return false
}
return false
}
variable extension go์๋ง ์๋ ๊ธฐ๋ฅ์ธ๋ฐ, ์กฐ๊ฑด๋ฌธ ์์์ ์ฌ์ฉํ ๋ณ์๋ฅผ ์กฐ๊ฑด๋ฌธ ์์์ ์ฌ์ฉํ๋…? ๊ทธ๋ฐ ๋ฌธ๋ฒ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
// if else
if koreanAge := age + 2 ; koreanAge < 18 {
return false
}
return true
// switch
switch koreanAge := age + 2 ; koreanAge {
case 10 :
return false
case 18 :
return true
}
Pointer C์ธ์ด ์ดํ๋ก ์ ๋ง ์ค๋๋ง์ ๋ณด๋ ๊ธฐ๋ฅ์ด๋ค! C ๋ฐฐ์ธ๋ ์ฌ๊ธฐ์ ๋ง์ด๋ค ํฌ๊ธฐํ์์ง…
๊ธฐ๋ณธ์ ๊ฐ๋
์ ๊ฐ๊ณ , ์ฌ์ฉ๋ฒ๋ ๋น์ทํ๋ค.
&
: address(์ฃผ์)*
: address์ ๊ฐ:=
์ด ์๋๋ผ ์ ์ธ๋ง ํ๊ณ ์ถ๋ค๋ฉด, var potiner *int
๋ฅผ ์ฌ์ฉํ์ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main () {
a := 2
b := & a
fmt . Println ( b , * b )
// -> 0x1400001c070 2
a = 10
fmt . Println ( b , * b )
// -> 0x1400001c070 10
* b = 20
fmt . Println ( a )
// 20
}
Array & Slice ๋ฐฐ์ด์๋ 2๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค! ๋ผ๊ณ ํ๊ธฐ์ ์กฐ๊ธ ์ ๋งคํ๊ธดํ๋ฐ, lenght๋ฅผ ์ง์ ํด์ฃผ๊ฑฐ๋ ์ํด์ฃผ๊ฑฐ๋๋ก 2๊ฐ์ง๋ก ๋๋๋ค. array๋ lenght๊ฐ ๊ณ ์ ๋๊ณ , slice๋ ๊ณ ์ ๋์ง ์๋๋ค.
1
2
3
4
5
6
7
// array
func main () {
names := [ 5 ] string { "sanbal" , "hello" , "world" }
fmt . Println ( names )
names [ 3 ] = "hi"
fmt . Println ( names )
}
1
2
3
4
5
6
7
// slice
func main () {
names := [] string { "sanbal" , "hello" , "world" }
fmt . Println ( names )
names = append ( names , "hi" , "happy" )
fmt . Println ( names )
}
array๋ ์ ํต์ ์ธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ! ๋น์ฐํ lenght๋ฅผ ๋ฒ์ด๋๋ index์๋ ๊ฐ์ ๋ฃ์ ์ ์๋ค. vscode๊ฐ ์๋ ค์ฃผ๋๋ฐ? slice๋ python์์ ์ฌ์ฉํ๋ฏ์ด ์ฌ์ฉํ ์ ์์ง๋ง. append๋ ์ฌํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํด์ผํ๋ค. ์์งํ python ์ด๋ค๊ฑฐ๋ ํจ์๋ ์๊ธฐ์์ ๋ฐ๊พธ๊ณ , ์ด๋ค๊ฑฐ๋ ํ ๋นํด์ผํ๊ณ ๊ทธ๋์ ์กฐ๊ธ ํท๊ฐ๋ ธ์๋ค… Map map๋ ์ฌํํ๋ค. ์ฌํํ๋ค ๋ชปํด ๊ธฐ๋ฅ์ด ์๋ค. ์์ผ๋ฉด ๋ง๋ค์ด ์จ์ผ์ง ๋ญ…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func main () {
// key์ value์ ์๋ฃํ์ ๋ฑ ์ ํด์!
ksanbal := map [ string ] string {
"name" : "ksanbal" ,
"age" : "SuperSecret" ,
}
fmt . Println ( ksanbal )
// ์ถ๊ฐ๋ ์ด๋ ๊ฒ
ksanbal [ "blog" ] = "devksanbal.site"
fmt . Println ( ksanbal )
// for range๊ฐ ๊ฐ๋ฅ!!
for key , value := range ksanbal {
fmt . Println ( key , value )
}
}
๋น์ด์๋ map์ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
1
2
3
4
5
6
7
8
// ์๋ชป๋ ๋ฐฉ๋ฒ
var result map [ string ] string
result [ ' hello ' ] = ' world ' // ๊ทธ๋ด ๋ฏ ํด๋ณด์ด์ง๋ง, panic์ ๋ฐ์ํ๋ค. result๊ฐ nil๋ก ์ฒ๋ฆฌ๋๊ฒ ๋๋ฌธ
// ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
result := map [ string ] string {} // ๋์ {}๋ก ์ด๊ธฐํํด์ค๋ค.
var result = make ( map [ string ] string ) // make() ํจ์๋ฅผ ์ด์ฉํด ์ด๊ธฐํํ๋ค.
result [ ' hello ' ] = ' world '
Struct map ํํ์ value๋ฅผ ๋ค์ํ ์๋ฃํ์ผ๋ก ํ๊ณ ์ถ์ ๋๊ฐ ์๋ค. ๋ณดํต ๊ทธ๋ ๊ฒ ๊ด๋ฆฌํ๊ธฐ๋ ํ๊ณ . go์๋ class๊ฐ ์๋ ๋์ struct๊ฐ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type persion struct {
name string
age int
anything [] string
}
func main () {
ksanbal := persion { "ksanbal" , 18 , [] string { "hello" , "world" }}
// ๋๋
ksanbal = person {
name : "ksanbal" ,
age : 18 ,
anything : [] string { "hello" , "world" },
}
// keyword ๋ฐฉ์๊ณผ positioned ๋ฐฉ์์ ์์ด ์ฌ์ฉํ ์ ์๋ค.
}
class ๋์ struct๋ฅผ ์ฐ๋๊น ๊ทธ๋ฆฌ์ด ๋ถ๋ถ์ด ์๊ธฐ๋๋ฐ ๋ฐ๋ก private์ construct์ด๋ค. go์์๋ ์ด๋ป๊ฒ ๊ตฌํํ ๊น
์ผ๋จ account๋ผ๋ ํด๋๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์ account.go
ํ์ผ์ ์์ฑํ์.
Go์์๋ ์ฌ๋ฐ๊ฒ๋ ๋ณ์, struct, func์ ์ด๋ฆ ์๊ธ์๋ฅผ ์๋ฌธ์๋กํ๋ฉด private
, ๋๋ฌธ์๋กํ๋ฉด public
์ด๋ค.
์๋์ ๊ฐ์ด account๋ฅผ ์์ฑํ๋ฉด, ์ค๊ฐ์ account์ .
์ผ๋ก ์ ๊ทผํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
Constructor 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// account.go
package account
// Account struct
type Account struct {
owner string
balance int
}
// NewAccount creates Account
// instance๋ฅผ ๋ง๋ค์ด ๋ณต์ ํ๋ ๊ฑด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋๊น, pointer๋ฅผ ์ด์ฉํด ๊ฐ์ ์ ๋ฌํ์.
func NewAccount ( owner string ) * Account {
account := Account {
owner : owner ,
balance : 0 ,
}
return & account
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// main.go
package main
import (
"fmt"
"github.com/devKsanbal/account"
)
func main () {
account := account . NewAccount ( "ksanbal" )
fmt . Println ( account )
}
Method ์ด๋ฒ์ struct์ method๋ค์ ์์ฑํด๋ณด์. ์ฌ๊ธฐ์ Deposit method์์ *์ ์ ์ํ์! go๋ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ ๋ณต์ฌํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, pointer๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ํจ์ ๋ด์์๋ง ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// GetBalance ํ์ฌ ๊ธ์ก ์ถ๋ ฅ
func ( a Account ) GetBalance () int {
return a . balance
}
// Deposit ์
๊ธ
func ( a * Account ) Deposit ( amount int ) {
a . balance += amount
}
// String fmt.Println(account) ํ์๋ ๋์ฌ String ํจ์ override
func ( a Account ) String () string {
return fmt . Sprint ( a . GetOwner (), "'s account\nHas : " , a . GetBalance ())
}
Error ์ฒ๋ฆฌ go์์๋ ์๋ฌ๊ฐ ๋จ๋ฉด ํ๋ก๊ทธ๋จ์ ๋ฉ์ถ๊ณ ๊ทธ ๋ด์ฉ์ ๋ฑ์ด์ฃผ์ง ์๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์๋ฌ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ฐ์์์ผ์ผํ๋ค.
log.Fatalln()
์ ์๋ฌ ๋ด์ฉ์ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํด์ค๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// account.go
func ( a * Account ) Withdraw ( amount int ) error {
if a . balance < amount {
var errNoMoney = errors . New ( "Can't withdraw, you are poor" )
return errNoMoney
}
a . balance -= amount
return nil // ๋ญ๋ return ํด์ผํ๊ธฐ ๋๋ฌธ์, nil(null,None)์ผ๋ก ๋ฐํ
}
// main.go
func main () {
account := account . NewAccount ( "ksanbal" )
account . Deposit ( 10 )
err := account . Withdraw ( 20 )
if err != nil {
log . Fatalln ( err )
}
fmt . Println ( account )
}
Dictionary ์ด๋ฒ์ struct๊ฐ ์๋ dictinary์ method๋ฅผ ์ถ๊ฐํด๋ณด์. ์ ์ map์ ๊ธฐ๋ฅ์ด ์๋ค๋ ์๊ธฐ๋ฅผ ํ์๋๋ฐ ๊ทธ๊ฑธ ๋์ ํ๋ ๋๋์ผ๋ก ๋ง๋ค๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// mydict.go
var (
errNotFound = errors . New ( "Not Found" )
errCantUpdate = errors . New ( "Can't update non-existing word" )
errCantDelete = errors . New ( "Can't delete non-existing word" )
errAlreadyExist = errors . New ( "Already Exit" )
)
// Dictionary type
type Dictionary map [ string ] string
// Search for word
func ( d Dictionary ) Search ( word string ) ( string , error ) {
value , exists := d [ word ] // dictonary[value]๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๊ณผ, ์กด์ฌ์ฌ๋ถ๋ฅผ ๋ฐํํด์ค๋ค. ๊ทธ ์ ์ ์ด์ฉํ์
if exists {
return value , nil
}
return "" , errNotFound
}
// Add Add a word
func ( d Dictionary ) Add ( word , def string ) error {
_ , err := d . Search ( word )
switch err {
case errNotFound :
d [ word ] = def
case nil :
return errAlreadyExist
}
return nil
}
// Update update a word
func ( d Dictionary ) Update ( word , def string ) error {
_ , err := d . Search ( word )
switch err {
case nil :
d [ word ] = def
case errNotFound :
return errCantUpdate
}
return nil
}
// Delete delete word
func ( d Dictionary ) Delete ( word string ) error {
_ , err := d . Search ( word )
switch err {
case nil :
delete ( d , word )
case errNotFound :
return errCantDelete
}
return nil
}
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// main.go
func main () {
// Search
dictionary := mydict . Dictionary { "first" : "First Word" }
definition , err := dictionary . Search ( "second" )
if err != nil {
fmt . Println ( err )
} else {
fmt . Println ( definition )
}
definition , err = dictionary . Search ( "first" )
if err != nil {
fmt . Println ( err )
} else {
fmt . Println ( definition )
}
// Add
dictionary = mydict . Dictionary {}
err = dictionary . Add ( "hello" , "Greeting" )
if err != nil {
fmt . Println ( err )
}
definition , _ = dictionary . Search ( "hello" )
fmt . Println ( definition )
err2 := dictionary . Add ( "hello" , "Greeting" )
if err2 != nil {
fmt . Println ( err2 )
}
// Update
dictionary = mydict . Dictionary {}
dictionary . Add ( "hello" , "First" )
// err := dictionary.Update("hello", "Second")
err = dictionary . Update ( "test" , "Second" )
if err != nil {
fmt . Println ( err )
} else {
word , _ := dictionary . Search ( "hello" )
fmt . Println ( word )
}
// Delete
dictionary = mydict . Dictionary {}
dictionary . Add ( "hello" , "First" )
dictionary . Add ( "world" , "Second" )
fmt . Println ( dictionary )
err = dictionary . Delete ( "hello" )
if err != nil {
fmt . Println ( err )
} else {
fmt . Println ( dictionary )
}
}
GoRoutines go์์ ๊ฐ์ฅ ์น์ํ ์ ์ ๋ฐ๋ก Goroutines๋ผ๋ ๋์์คํ์ด๋ค. ์ฌ์ฉ๋ฒ๋ ์ฝ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
func main () {
people := [ 4 ] string { "ksanbal" , "hyunkyun" , "hello" , "world" }
for _ , person := range people {
go isSexy ( person )
}
}
func isSexy ( person string ) {
time . Sleep ( time . Second * 5 )
fmt . PrintLn ( person , " is sexy" )
}
๊ทผ๋ฐ ๊ทธ๋ฅ ์ด๋ ๊ฒ ์ฐ๋ฉด ์๋ฌด ๊ฒฐ๊ณผ๋ ๋ชป๋ณด๊ณ ๋๋๋ค. ์์ผ๊น? ๊ทธ ์ด์ ๋ main()ํจ์๋ GoRoutines์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ค๋ฆด ์ ์๊ณ , ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์ผํ๋ค. ๊ทธ๊ฑธ ์ํด ์กด์ฌํ๋ ๊ฒ์ด Channel์ด๋ค.
Channels Channel์ GoRoutines์ด ๋ฐํํ๋ ๊ฐ์ ๋ฐ์์ฃผ๋ ์ญํ์ ํ๋ค. callback
ํจ์ ๊ฐ์ ๋๋์ด์ง๋ง ์๋ ๊ฒ ๊ฐ๋ค. ์ฌ์ฉ๋ฒ์ ์ฝ๋ค. <-
๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ๋ฐ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func main () {
people := [ 4 ] string { "ksanbal" , "hyunkyun" , "hello" , "world" }
c := make ( chan string ) // string์ ๋ฐํ๋ฐ๋ chan์ธ c๋ฅผ ์์ฑํ๋ค.
for _ , person := range people {
go isSexy ( person , c )
}
// ์คํ์ด ์ข
๋ฃ๋๋๋๋ก ๋์ด์จ ๊ฐ์ ์ถ๋ คํด์ค๋ค.
result1 := <- c
result2 := <- c
fmt . Println ( <- c )
fmt . Println ( <- c )
fmt . Println ( <- c ) // ๋์ด์ ์ ๋ฌ๋ฐ์ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ deadlock ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
}
func isSexy ( person string , c chan string ) {
time . Sleep ( time . Second * 5 )
c <- person + " is sexy"
}
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋ค. <-
์ blocking operation์ด๋ค. ์ฆ ๊ฐ์ด ์ ๋ฌ๋ ๋๊น์ง ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฐ์ ๊ธฐ๋ค๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ <-
์ด ์ ๋ฌ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ผ๋ฉด deadlock
์๋ฌ๋ฅผ ๋ฐ์ํ๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func main () {
people := [ 4 ] string { "ksanbal" , "hyunkyun" , "hello" , "world" }
c := make ( chan string ) // string์ ๋ฐํ๋ฐ๋ chan์ธ c๋ฅผ ์์ฑํ๋ค.
for _ , person := range people {
go isSexy ( person , c )
}
for i : 0 ; i < len ( people ); i ++ {
fmt . Println ( <- c )
}
}
func isSexy ( person string , c chan string ) {
time . Sleep ( time . Second * 5 )
c <- person + " is sexy"
}
์ฌ์ค ๋ณ๊ฑด ์๊ณ for๋ฌธ์ผ๋ก GoRoutines์ ์์ฑํ๋งํผ ๋๋ ค์ฃผ๋ฉด ๋๋ค. <-c
๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฑฐ๋๊น, for๋ฌธ ์ฒซ์ค์ ๋ฃ๊ณ ๊ทธ ๋ค์ callback
ํจ์์ฒ๋ผ ์์ฑํ๋ฉด ๋ก์ง์ ์ํํ ์ ์์ ๊ฒ ๊ฐ๋ค.
Send only & Recevie only ๊ทธ๋ฆฌ๊ณ channel์ send only์ receive only ์ต์
์ ์ ์ฉํ ์ ์๋ค. ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ๋ฏธ๋ฆฌ ๊ธฐ๋ฅ์ ์ฐจ๋จํด์, ์ฝ๋ ์์ฑ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ ๊ฒ์ด๋ค. <-
์ ์์น์ ๋ฐ๋ผ ์ ์ฉ๋๋ฉฐ send only์์ ๊ฐ์ ๋ฐ์ผ๋ คํ๋ฉด, vscode์์ ๋ฏธ๋ฆฌ ๊ฒฝ๊ณ ๋ฅผ ๋ด์ค๋ค.
1
2
3
4
5
6
7
8
9
// send only
func hitURL ( url string , c chan <- requestResult ) {
...
}
// receive only
func hitURL ( url string , c <- chan requestResult ) {
...
}
์์ํ ๊ฒ ๋ฐฐ์ด์ ๋ฐฐ์ด๋ช
๋ค์ ...
์ ์ด์ฉํด์ ๋ชจ๋ ์์๋ฅผ ๊บผ๋ผ ์ ์๋ค.append(jobs, []*string* {"police", "doctor", "teacher"}...)