Programming Language/Go

[Go] Go언어 튜토리얼_Pointers, Arrays, Slices, Maps, Structs

new_challenge 2020. 4. 2. 00:07
반응형

이번 포스팅은 GO언어만의

특징을 볼 수 있는 튜토리얼입니다.

 

 

 

 

 

1. Pointers

- 메로리로 접근해서, 메모리의 주소도 확인 할 수 있고, 주소에 저장 된 값도 볼 수 있음

 

[ 예제 1 ]

package main

import "fmt"


func main() {
    a := 2
    b := a
    fmt.Println(a, b)
}

>> 예제 1을 실행 할 경우 결과는 2 2 이다

 

 

[ 예제 2 ]

package main

import "fmt"


func main() {
    a := 2
    b := a
    a = 10
    fmt.Println(a, b)
}

>> 예제 2을 실행 할 경우 결과는 10 2 이다

 

 

[ 예제 3 ]

package main

import "fmt"


func main() {
    a := 2
    b:= &a
    a = 10
    
    fmt.Println(a, b)
    fmt.Println(a, *b)
}

>> 예제 2을 실행 할 경우 첫번 째 결과는 10 메모리주소 이다

>> 예제 2을 실행 할 경우 첫번 째 결과는 10 10 이다

 

- 여기서 알 수 있는 것은 출력 변수 앞에 &를 붙여주면 메모리 주소로 연결된다.

- *는 살펴보거나 바라본다는 느낌으로 메모리주소 앞에 붙여주면 값을 확인 할 수 있다.

- 위 코드는 a는 값은 출력되는 메모리 주소에 저장되어 있고, b는 a의 메모리 주소를 바라보기 때문에 a가 업데이트되면 b도 업데이트 된다.

 

 

[ 예제 4 ]

package main

import "fmt"


func main() {
    a := 2
    b := &a
    *b = 20
    print(a, b)
}

>> 현재 a와 b가 가지고 있는 메모리 주소가 동일하기에 b를 이용해서 a의 값이 변경될 수 있다

>> b는 a를 바라보는 pointer이기 때문에 b를 사용해서 a를 변화시킬 수 있음 

 

 

[ 결론적으로 ]

1. 어떤 값의 메모리 주소를 보고 싶다면 앞에 &를 붙인다.

2. 메모리 주소를 통해 값을 살펴보고 싶다면 *를 붙인다.

3. Pointer는 바라보는 값을 변경할 수 있다. 메모리 주소가 동일 할 경우

4. &는 주소와 같은 것, *는 그 주소의 값을 살펴보는 것 

 

 

2. Arrays and Slices

[ Arrays ] 

- Go언어의 Array는 일반적인 언어의 array와 약간 다름

- Go언어는 Array를 생성 할 때 꼭 길이를 명시해줘야함

package main

func main() {
    names := [5]string{"one","two","three","four"}
    names[3] = "change"
    fmt.Println(names)
}

>> array 선언 법 : [길이]타입{값} 형태로 사용

>> array 값 변경을 원할 때는 index를 지정해서 새로운 값을 할당

>> 기존의 인덱스 안에 있는 값만 변경 가능, 새로운 index를 추가로 생성 할 수 없다.

 

 

[ Slices ] 

- Go에서 Slices는 기본적으로 Array와 같지만 길이가 정해지지 않는다

package main

import "fmt"


func main() {
    names := []string{"one","two","three","four","five"}
    names[3] = "change"
    result := append(names, "adding")
    
    fmt.Println(names)
    fmt.Println(result)
}

>> Slices에 아이템을 추가 가능함 : append(slices, 추가할 값) 2개의 arguments와 함께 사용가능

>> append()는 새로운 값이 추가 된 slice를 return함. slices 원본 자체를 바꾸는 것은 아님

 

코드 실행 화면

 

 

3. Maps

- Map은 key:value 형태로 값을 가진다

 

[ 예제1 ]

package main

import "fmt"


func main() {
    test := map[string]string{"name":"go", "age":"10"}
    fmt.Println(test)
}

>> map 선언 : map[키타입][값타입]{실제_키와값}

 

 

[ 예제2 ]

package main

import "fmt"


func main() {
    test := map[string]string{"name":"go", "age":"10"}
    for key, value := range test {
        fmt.Println(key, value)
    }
}

>> map에서 iterate 사용

 

 

4. Structs

- Struct : object와 비슷하면서 map보다 유연함

package main

type person struct {
    name string
    age int
    favFood []string
}


func main() {
    favFood := []string{"pasta", "pizza"}
    
    # struct 생성1
    go := person{"go", 10, favFood}
    
    # struct 생성2
    python := person{name:"python", age:15, favFood: favFood}
    
    fmt.Println(go)
    fmt.Println(python)
}

>> Struct을 생성하기 위해서는 우선 struct에 대한 정의를 해야함

>> Struct에 대한 정의 후 생성 하는 방법은 크게 2가지가 있다

    1. 위에서 정의 한 Struct 값 순서대로 넣는다

    2. key와 value를 지정해서 넣어준다 (명확한 코드 작성 가능

 

반응형