Go언어에 관하여
Go의 역사
GO언어는 2009년에 Google에서 만들어진 오픈 소스 프로그래밍 언어이다.
그리고 GO는 UTF-8
을 기본 문자로 갖는다.
Go의 특징
pakage
Go는 1개의 main package와 여러 개의 다른 package를 가지고 있다.
원하는 기능을 가진 package를 가져와서 사용하면 된다.
main은 시작점이기 때문에 따로 설정해 줄 수 없고 단 한개만을 사용한다.
fmt는 function의 약자이다.(un -> m) fmt는 함수를 정의하기 위해 사용한다.
변수
변수란 값을 저장하는 메모리 공간을 가리키는 이름이다.
값을 저장하는 공간은 크게 하드디스크
, memory
두개로 나뉜다.
하드디스크는 느리지만 프로그램이 종료되어도 데이터가 유지된다.
memory는 빠르지만 프로그램이 종료되면 데이터가 없어진다.
변수는 다음의 4가지 속성을 가진다.
var a int = 10
가 있다고 치면
- 이름
- 이 이름을 통해 변수를 사용할 수 있다.
- a가 이름이다.
- 값
- 변수가 존재하는(값을 저장하는) 공간이다.
- 즉 a라는 변수가 가진 메모리 공간 10이 적히게 된다.
- 주소
- 메모리 상의 위치를 나타내기 위해 사용하는 것이 주소이다.
- 컴퓨터 입장에서는 사실 이 주소가 중요하다. -> 어떤 변수를 찾아갈 때에 컴퓨터는 이 주소를 기준으로 찾아가기 때문이다.
- 타입
- 타입은 int이다.
- 이를 통해 size를 알 수 있다.
- type이 결정되면 size가 정해지기 때문이다. -> type에 맞추어 저장될 size를 고정시키기 때문
변수 타입에 대해
숫자 타입
정수랑 실수이다.
- uint8
- uint16
- uint32
- uint64
- int8
- int16
- int32
- int64
- float32
- float64
uint형은 unsigned int형이다.
- byte
- uint8과 같은친구인데, 별칭타입이다.(aliasing 타입)
- 왜냐면 byte형식이 부호없는 8비트짜리라서임
- uint8과 같은친구인데, 별칭타입이다.(aliasing 타입)
- rune
- 그래서 rune은 int32의 별칭타입이다.
- 문자 1개를 나타내는 친구이다.
- 그러니까 rune이 모이면 string이 될 것이다.
- go는 UTF-8이니까 이 하나의 문자는 1~3byte이다.
- 그러니까 이걸 저장하려면 적어도 3byte짜리로 해야 할 것이다.
- 근데 컴퓨터는 2의 배수로 값을 증가시킨다(2진수를 쓰기 때문)
- 그래서 4byte짜리를 쓰는건데, 그게 int32형이라서 그럼ㅇㅇ
- 근데 컴퓨터는 2의 배수로 값을 증가시킨다(2진수를 쓰기 때문)
- 그러니까 이걸 저장하려면 적어도 3byte짜리로 해야 할 것이다.
- int
- 이거는 컴퓨터에 따라 달라진다.
- 32bit 컴퓨터는 int32가 된다.
- 64bit 컴퓨터는 int64가 된다.
- 요즘은 근데 어지간하면 64bit를 쓰니까 int64가 될 것이다.
- uint
- 위랑 마찬가지로 생각해주면 된다. 다만 unsigned 형태인것 뿐.
그 외 타입
- bool
- string
- 배열
- 슬라이스
- 구조체
- 포인터
- 함수타입
- 맵
- 인터페이스
- 채널
이거는 나중에 배우게 될 것이다.
별칭 타입
위에 적혀있는 rune, byte, int등등 애들도 별칭 타입이다.
이 별칭 타입은 어떤 타입에 다른 이름을 부여하는 것이다.
type
으로 정의해줄수 있다.
예를 들어
type chanHandsome int
라고 하면
chanHandsome타입은 int의 별칭타입이 되는 것이다.
변수 선언하기
var a int = 10
var a int
var a = 10
-> 이거는(type 생략시) 뒤에 숫자를 생략할 수 없다. 그리고 이렇게 되면 뒤의 타입에 맞추어 var이 정의된다. 여기서는 int형으로 정의될 것이다.
a := 10
-> var이랑 type 두개 다 생략 가능하다.
-> := 는 선언대입문이다. var를 그냥 저렇게 쓸 수 있음.
type별 기본값
nil은 나중에 다시 배우게 될 것이다.
Type변환
연산의 각 항목의 타입은 반드시 같아야 한다.
예를 들어서
var a int = 10
var b int16 = 20
a + b
이러면 go에서는 이게 안된다. (강타입, 그중에서도 굉장히 강한 언어이기 때문이다.)
그래서 이것들을 해주려면 Type을 변환시켜주어야 한다.
Type별 값의 범위
Type변환 주의사항
package main
import "fmt"
func main() {
var a int16 = 3456
var b int8 = int8(a)
fmt.Println(a, b)
}
이렇게 하면
요런 결과가 나온다.
이거는 이제 overflow되어서이다.
그러니까 타입 변환할때 이런걸 조심하자...
'이론 정리 > Golang' 카테고리의 다른 글
Go의 GC에 대해 (feat. java) (1) | 2022.10.31 |
---|---|
Golang의 포인터 (0) | 2022.07.24 |
Golang의 구조체 (0) | 2022.07.24 |
Golang의 배열 (0) | 2022.07.24 |
Golang - 고랭 이란?? (0) | 2022.07.24 |