go 학습

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

코딩하는logcat 2023. 1. 5. 04:13

이번 글에서는 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}

는 안된다.

 

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