이번 글에서는 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
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
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}
는 안된다.
변수명을 쓸건지 안쓸건지 통일해야 한다.
'go 학습' 카테고리의 다른 글
Golang으로 웹 크롤러(web crawler) 만들기(feat chatGTP) (0) | 2023.02.14 |
---|---|
go 기초학습4(페키지 export, 생성자, 메소드 , error) (0) | 2023.01.09 |
go 기초 학습2 (함수, for, if, switch) (0) | 2023.01.05 |
go 언어 기초1(설치, 상수와 변수, 함수) (0) | 2023.01.02 |