var 변수명 *자료형
var numPtr *int //포인터형 변수를 선언하면 nil로 초기화 됨
fmt.Println(numPtr) //nil
Go 언어는 NULL 값을 nil로 사용함.
Go 언어는 메모리 주소를 직접 대입하거나 포인터 연산을 허용하지 않는다.
빈 포인터형 변수는 new 함수로 메모리로 할당해야 함
포인터_변수 = new(자료형)
var numPtr *int = new(int)
fmt.Println(numPtr) //메모리 주소 출력
*포인터_변수명 - 역참조
var numPtr *int = new(int) //new 함수로 공간 할당
*numPtr = 1 //역참조로 포인터형 변수에 값을 대입
fmt.Println(*numPtr) //1 포인터형 변수에서 값을 가져오기
&변수명 - 해당 변수의 메모리 주소
var num int = 1
var numPtr *int = &num //참조로 num변수의 메모리 주소를 구하여
//numPtr 포인터 변수에 대입
fmt.Println(numPtr) //numPtr 포인터 변수에 저장된 메모리 주소
fmt.Println(&num) //참조로 num변수의 메모리 주소를 구함
-------------구조체 사용하기-----------------
구조체 - 여러 변수를 담을 수 있는 구조체
type 구조체명 struct {}
{} 블록 안에는 구조체의 필드 목록을 정의함
type Rectangle struct {
width int
height int
}
-----------구조체에 메서드 연결하기-------------
Go언어에는 클래스가 없는 대신 구조체에 메서드를 연결할 수 있다
func(리시버명 *구조체_타입) 함수명() 리턴값_자료형 {}
type Rectangle struct {
width int
height int
}
func (rect *Rectangle) area() int {
return rect.width * rect.height
}
func main() {
rect := Rectangle{10, 20}
fmt.Println(rect.area()) //결과값 : 200
}
------------포인터 방식, 일반 구조체 방식-----------
//포인터 방식
func (rect *Rectangle) scaleA(factor int) { //포인터라 원래의 값이 변경 됨
rect.width = rect.width * factor
rect.height = rect.height * factor
}
//일반 구조체 방식
func (rect Rectangle) scaleB(factor int) { //값이 복사되어서 원래의 값에는 영향 x
rect.width = rect.width * factor
rect.height = rect.height * factor
}
func main() {
rect1 := Rectangle{30, 30}
rect1.scaleA(10)
fmt.Println(rect1) //{300, 300} : rect1에 바뀐 값이 들어감
rect2 := Rectangle{30, 30}
rect2.scaleB(10)
fmt.Println(rect2) //{30, 30} : rect2는 값이 바뀌지 않음
댓글 없음:
댓글 쓰기