반응형
◆ 포인터
▶ 메모리 참조를 저장하는 자료형
var 변수명 *자료형
● nil(null)로 초기화
package main
import "fmt"
func main() {
var numPtr *int
fmt.Println(numPtr)
}
▶ new(자료형)으로 메모리를 할당
package main
import "fmt"
func main() {
var numPtr *int = new(int)
fmt.Println(numPtr)
}
▶ *포인터변수를 이용해서 할당받은 메모리를 참조
package main
import "fmt"
func main() {
var numPtr *int = new(int)
*numPtr = 10
fmt.Println(numPtr)
fmt.Println(*numPtr)
}
▶ 기존 데이터의 참조를 하고자 하는 경우는 &데이터를 이용
package main
import "fmt"
func main() {
i := 10
var numPtr *int = &i
fmt.Println(numPtr)
fmt.Println(*numPtr)
}
※ call by value & call by reference
▶ 함수의 매개변수로 참조형 데이터를 전달하면 call by reference
package main
import "fmt"
func callByValue(n int) {
n = 2
fmt.Println(n)
}
func callByReference(n * int) {
*n = 2
fmt.Println(*n)
}
func main() {
var n int = 1
callByValue(n)
fmt.Println(n)
callByReference(&n)
fmt.Println(n)
}
◆ Struct(구조체)
▶ 여러 데이터의 집합
▶ 구조체에 속한 필드 이름이 소문자로 시작하면 다른 패키지에서 접근할 수 없음
▶ 선언
type myStruct struct{
intField int
stringField string
sliceField []int
}
▶ 구조체 초기화
var s1 = myStruct{
intField: 3,
stringField: "three",
sliceField : []int{1,2,3},
}
var s2 = myStruct{3,"three",[]int{1,2,3}}
var s3 = myStruct{}
s3.intField = 3
s3.stringField = "three"
s3.sliceField = [] int {1, 2, 3}
▶ 구조체 포인터
package main
import "fmt"
type myStruct struct{
intField int
stringField string
sliceField []int
}
func main() {
var sPtr = &myStruct{
intField:3,
stringField:"three",
sliceField: []int{1,2,3},
}
fmt.Println(sPtr)
var s = &myStruct{}
s.intField = 3
s.stringField = "three"
s.sliceField = []int{1,2,3}
fmt.Println(s)
var ins = new(myStruct)
ins.intField = 3
ins.stringField = "three"
ins.sliceField = []int{1,2,3}
fmt.Println(ins)
}
▶ 생성자와 유사한 방식
package main
import "fmt"
type Rectangle struct {
width int
height int
}
func NewRectangle(width, height int) *Rectangle {
return &Rectangle{width, height} // 구조체 인스턴스를 생성한 뒤 포인터를 리턴
}
func main() {
rect := NewRectangle(20, 10)
fmt.Println(rect) // &{20 10}
}
▶ 타입에 연결하는 함수
func (리시버이름 * 구조체타입 또는 구조체타입) 함수이름(매개변수)리턴타입{}
package main
import "fmt"
type Rectangle struct {
width int
height int
}
func (rect *Rectangle) getWidth() int {
return rect.width
}
func (rect *Rectangle) getHeight() int {
return rect.height
}
func main() {
rect := Rectangle{20, 10}
fmt.Println(rect.getWidth())
}
다음포스팅에서는 메서드와 임베디드 그리고 인터페이스에 대해서 알아보도록 하자
반응형
'IT 초보코딩의 세계 > Go 언어' 카테고리의 다른 글
Go언어의 채널(Channel), Select 구문, Sync 패키지 2장 (0) | 2023.04.04 |
---|---|
Go언어의 동시성 과 Goroutine, 데이터공유 1장 (0) | 2023.04.04 |
Go언어의 자료구조 맵(Map)와 컨테이너 (0) | 2023.03.30 |
Go언어의 자료구조 배열과 슬라이스 1장 (6) | 2023.03.29 |
Go 언어의 기본 문법 함수 와 클로저 5장 (4) | 2023.03.28 |
댓글