본문 바로가기

go 학습

go 기초 학습3 (pointer, array, slice, map, sturct)

이번 글에서는 go에서만 있는 부분을 다룰 것이다.

1.pointer

go는 java나 python같은 high lever 언어처럼 계발이 편하면서도

 

c같은 low lever 언어처럼 하드웨어를 직접 관리할 수 있다.

 

이것이 go의 가장 큰 장점이다.

 

package main

import (
    "fmt"
)

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

}
 
결과
0xc000016098
0xc000016098 0xc0000160d0
0xc000016098 2
20
c에서 포인터를 공부했으면 그냥 넘어가도 되지만 아닌 사람들을 위해 기본적인 개념만 잡아두면
var a int = 2
이렇게 정수형 변수 a를 생성했다
&a 는 a의 주소값을 말한다.
주소값이란 메모리(RAM)에서 해당 변수가 저장된 위치를 이야기 한다.
var b *int = &a

정수형 변수의 주소값을 가지는 포인터 b를 생성했다.

b를 출력하면 a의 주소값이 나올 것이다

 

*b는 b에 위치한 변수의 값을 말한다.

 

즉 *b를 출력하면 a가 나올 것이다.

 

 

2.array, slice

 

func main() {
    words := [4]string{"apple", "banana", "lemon", "orange"}
    fmt.Println(words)
}
결과
[apple banana lemon orange]
 
 
go에서 배열을 생성할때는 방의 수와 타입, 값을 명시해준다.
 
java에는 arraylist가 c++에는 vector가 있듯
 
go에는 slice가 있다.
 
slice는 인덱스 수가 없는 배열이다.
 
words := []string{"apple", "banana", "lemon", "orange"}
 
words 슬라이스는 방갯수가 4인 배열과 성질이 같다.
 
하지만 배열은 방의 갯수를 변경할수 없고, 슬라이스는 변경할 수 있다.
 
func main() {
    words := []string{"apple", "banana", "lemon", "orange"}
    words = append(words, "tomato")
    fmt.Println(words)
}
결과
[apple banana lemon orange tomato]
 
 
append(슬라이스, 추가할 값)
함수는 java나 c++과 달리  기존 슬라이스에서 추가할 값을 더하여 새로운 슬라이스를 만드는 함수이다.
 
그렇기 때문에
 
append(words, "tomato") 라고 사용하지 않고
 
words = append(words, "tomato") 로 사용한다.

3.map

map이란 구조체와 배열을 섞어놓은 느낌이다.

구조체 하위호환 느낌?

 

python과 js의 object와 비슷하다고 하는데

나는 아직 object를 잘 모른다.

func main() {
    words := map[int]string{1: "apple", 2: "banana"}
    fmt.Println(words)
}
결과
map[1:apple 2:banana]
 
map은 키값과 키에 해당하는 value로 구성되어 있다.
 
map[key값의 타입]value값의 타입 
 
으로 선언한다.
 
 
func main() {
   
    words := map[int]string{1: "apple", 2: "banana"}
    for key, val := range words {
        fmt.Println(key, " : ", val)
    }
   
}
결과
1  :  apple
2  :  banana
 
이처럼 map도 반복문에서 쓸 수 있다
 
array는 index와 value를 반환하고
 
map은 key와 value를 반환한다.

 

4.struct

structure 비슷한 개념이다

 

package main

import (
    "fmt"
)

type user struct {
    id    string
    pass  string
    words []string
}

func main() {
    my_words := []string{"aa", "bb"}
    my_info := user{id: "logcat", pass: "1234", words: my_words}
    fmt.Println(my_info)
}
결과
{logcat 1234 [aa bb]}
 
 
 
(편의상 구조체로 부르겠다)
 
문자열 id,pass 와 문자열 슬라이스 words를 받는 구조체를 만들었다.

구조체 생성 방식은 

tpye 이름 struct{

    변수1

    변수2

}

이런식으로 우리가 알던 구조체와 유사하다

 

알다시피 구조체는 하나의 타입으로 취급된다.

 

my_info := user{id: "logcat", pass: "1234", words: my_words}

my_info := user{"logcat", "1234", my_words}

로 표기하는것은 가능하지만

my_info := user{id: "logcat", "1234", my_words}

는 안된다.

 

변수명을 쓸건지 안쓸건지 통일해야 한다.