[Go] Go언어 튜토리얼_Pointers, Arrays, Slices, Maps, Structs
이번 포스팅은 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를 지정해서 넣어준다 (명확한 코드 작성 가능