Array vs Slice
Array
- Python, JS์ ๋ฌ๋ฆฌ Golang์ array๋ ์ ํด์ง ๊ธธ์ด๊ฐ ์๋ค.
// Array
foods := [3]string{"kimchi", "pizza", "pasta"}
for _, food :=range foods {
fmt.Println(food)
}
// ๋๋
for i := 0; i <len(foods); i++ {
fmt.Println(foods[i])
}
> kimchi
> pizza
> pasta
Slice
- slice๋ ๊ฐ๋ณ ๊ธธ์ด์ ๋ฐฐ์ด์ด๋ค. ๋๊ดํธ ์์ ์ซ์๋ฅผ ์ง์ฐ๋ฉด slice๊ฐ ๋๋ค.
- slice์ ์์๋ฅผ ์ถ๊ฐํ ๋๋ append ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ๋ณต์ฌ๋ณธ์ผ๋ก ์๋ณธ slice๋ฅผ ์
๋ฐ์ดํธ ํด์ค์ผ ํ๋ค.
// Slice
foods := []string{"kimchi", "pizza", "pasta"}
fmt.Printf("%v\n", foods)
> kimchi
> pizza
> pasta
foods = append(foods, "icecream") // ์์ ์ถ๊ฐ
fmt.Printf("%v\n", foods)
> kimchi
> pizza
> pasta
> icecream
Pointer
- Go๋ ๊ฐ๋ฐ์๊ฐ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ฒ ํด์ค๋ค.
- ์๋์ ๊ฐ์ ๊ฒฝ์ฐ a์ ๊ฐ์ ๋ณ๊ฒฝํด๋ a์ ๊ฐ์ ๋ณต์ฌํ b์๋ ์ํฅ์ด ๊ฐ์ง ์๋๋ค.
- JS์ ์์์๋ฃํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, b์๋ a์ ๊ฐ์ ๋ณต์ฌํ์ฌ ๋
๋ฆฝ์ ์ธ ๋ณ์๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
a := 2
b := a
a = 12
fmt.Println(b) // 2
- ๋ณ์ ์์ (&)๋ฅผ ๋ถ์ด๋ฉด ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ป์ ์ ์๋ค.
- ์๋์ ์ฝ๋์์ b๋ a์ ์์น๋ฅผ ๋ด์ ํฌ์ธํฐ ๋ณ์๊ฐ ๋๋ค. ์ด๋ ๋ณต์ฌ๊ฐ ์๋๋ผ
์ฐธ์กฐ ๋ค!
- ์ฆ, a๋ฅผ ์ธ์ ์
๋ฐ์ดํธํ๋ b์์ a์ ๊ฐ์ ์ป์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ํฌ์ธํฐ ๋ณ์์ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๊ฐ์ ์ป์ผ๋ ค๋ฉด ํฌ์ธํฐ ๋ณ์ ์์ (*)์ ๋ถ์ด๋ฉด ๋๋ค.
a := 2
b := &a
a = 50
fmt.Println(b, &a)// 0x140000a6018 0x140000a6018
fmt.Println(*b)// 50
Struct & Receiver
- ๋ค๋ฅธ ์ธ์ด์์์ class์ method๋ฅผ Golang์์๋ struct์ receiver ํจ์๋ก ๋ณผ ์ ์๋ค.
- ํจ์ ์ด๋ฆ ์์ struct ์ด๋ฆ์ ๋ช
์ํด์ฃผ๋ฉด, ์ด๋ ํด๋น struct ํ์
์ ๋ณ์์๋ง ์ ํจํ receiver ํจ์๊ฐ ๋๋ค.
- NodeJS์์๋ export๋ฅผ ๋ฐ๋์ ๋ช
์ํด์ค์ผ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, Go์์๋ ๋๋ฌธ์๋ก ์์ํ๋๋ก ์์ฑํ๋ฉด ์๋์ผ๋ก Export๊ฐ ๋๋ค.
- ์ด ์ ์ ํ์ฉํ์ฌ struct์ ํ๋๋ ์๋ฌธ์๋ก ์์ฑํด์ ์ธ๋ถ์์ ์ง์ ์์ ํ์ง ๋ชปํ๋๋ก ํ๊ณ , receiver ํจ์๋ฅผ ํตํด ์ ๊ทผํ๊ฒ ๋ง๋ค ์ ์๋ค. (= ์บก์ํ)
- ์ฃผ์ํ ์ ์ receiver ํจ์์ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ receiver ํฌ์ธํฐ ํจ์๋ก ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
- struct ํ์
์์ (*)์ ๋ถ์ด์ง ์์ผ๋ฉด struct๋ฅผ ๋ณต์ฌํ ๊ฐ์ ๋ํด receiver ํจ์๊ฐ ์คํ๋๋ค.
Value Receiver
- receiver ํจ์์ ํ์
์ด struct์ ๊ฐ์ธ ๊ฒฝ์ฐ, struct์ ๊ฐ์ ๋ณต์ฌํ์ฌ ํจ์ ๋ด์์ ์ฌ์ฉํ๋ค.
- ํจ์ ๋ด์์ struct์ ํ๋๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋ ์๋ณธ struct์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- ๋ฐ๋ผ์, struct์ ํ๋ ์์ ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
Pointer Receiver
- receiver ํจ์์ ํ์
์ด struct์ ํฌ์ธํฐ์ธ ๊ฒฝ์ฐ, struct์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํตํด ์๋ณธ struct์ ์ง์ ์ ๊ทผํ๋ค.
- ํจ์ ๋ด์์ struct์ ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์๋ณธ struct๊ฐ ์์ ๋๋ค.
- ๋ฐ๋ผ์, struct์ ํ๋ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
// struct
type Personstruct {
name string
age int
}
// value receiver function
func (person Person) SayHello() {
fmt.Printf("Hello My name is %s and I'm %d", person.name, person.age)
}
// pointer receiver function
func (person *Person) SetDetails(name string, age int) {
person.name = name
person.age = age
}
func main() {
person := Person{}
person.SayHello()
person.SetDetails("confident-dev", 12);
fmt.Println(person)// confident-dev 12
}
์ฐธ๊ณ