함수가 종료되기 직전에 실행해야 하는 코드가 있을 수 있다. 대표적으로 파일이나 소켓 핸들처럼 OS 내부 자원을 사용하는 경우이다. 이 같은 자원은 OS 내부 자원이기 때문에 반드시 쓰고 나서 OS에 되돌려줘야 한다. 파일 작업 이후 반드시 파일 핸들을 반환해야 하기 때문에 이렇게 잊지 않고 처리해야 하는 코드가 있을 때 사용하는 것이 defer 이다. defer 명령문 이와 같이 적으면 명령문이 바로 실행되는 게 아닌 해당 함수가 종료되기 직전에 실행되도록 지연된다. 아래 예제를 살펴보자. package main import ( "fmt" "os" ) func main() { f, err := os.Create("test.txt") if err != nil { fmt.Println("Failed to ..
인스턴스란 메모리에 할당된 데이터의 실체다. 다음 코드는 Data 타입값을 저장할 수 있는 메모리 공간을 할당한다. var data Data 이렇게 할당된 메모리 공간의 실체를 인스턴스라고 부른다. Data 타입 포인터 변수를 선언하고 data 변수의 주소를 값으로 대입시켜보겠다. var data Data var p *Data = &data Data 타입 포인터 변수 p를 선언하고 data의 주소를 대입했다. 이때 포인터 변수 p는 data를 가리킨다고 한다. 이때 p가 생성될 때 새로운 Data 인스턴스가 만들어진 게 아니다. 기존에 있던 data 인스턴스를 가리킨 것이다. 즉 만들어진 총 Data 인스턴스 개수는 한 개다.