저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
핵심 정리
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
포인터Go 언어의 포인터는 * (Asterisk, 애스터리스크)를 자료형 앞에 붙입니다.
var numPtr *int
구조체 필드에 접근할 때는 포인터, 일반 변수에 상관 없이 . (점)으로 접근합니다.
type hello struct {
num1 int
numPtr *int
}
func main() {
var h hello
h.num1 = 10
h.numPtr = &h.num1
}
리시버는 구조체에 연결된 메서드에서 구조체의 인스턴스에 접근할 때 사용합니다. 리시버는 포인터로 받거나 일반 구조체 형식으로 받을 수 있습니다.
// ↓ 포인터 방식
func (rect *Rectangle) scaleA(factor int) {
rect.width = rect.width * factor // 포인터이므로 원래의 값이 변경됨
rect.height = rect.height * factor // 포인터이므로 원래의 값이 변경됨
}
// ↓ 일반 구조체 방식
func (rect Rectangle) scaleB(factor int) {
rect.width = rect.width * factor // 값이 복사되었으므로 원래의 값에는 영향을 미치지 않음
rect.height = rect.height * factor // 값이 복사되었으므로 원래의 값에는 영향을 미치지 않음
}
메서드에서 구조체 인스턴스의 값을 변경한다면 리시버를 포인터로 받고, 변경하지 않는다면 값 형식으로 받는 것이 명확합니다.
구조체 임베딩Go 언어는 상속을 구조체 임베딩이라는 방법으로 구현합니다. 임베딩은 구조체 안에서 포함할 구조체를 필드 이름 없이 타입만 지정하면 됩니다.
type Person struct {
name string
age int
}
type Student struct {
Person // 필드명 없이 타입만 선언하면 포함(Is-a) 관계가 됨
school string
grade int
}
인터페이스는 메서드 집합입니다. 다른 구조체라 하더라도 정의된 메서드만 같으면 인터페이스로 처리할 수 있습니다.
package main
import "fmt"
type hello struct {
num1 int
}
func (h hello) Print() {
fmt.Println("hello")
}
type world struct {
num1 float32
}
func (w world) Print() {
fmt.Println("world")
}
type Printer interface {
Print()
}
func main() {
var h hello
var p Printer = h
p.Print() // hello
var w world
p = w
p.Print() // world
}
덕 타이핑(Duck typing)은 인스턴스의 실제 타입은 상관하지 않고 구현된 메서드로만 타입을 판단하는 방식입니다. 즉, 새의 종류와는 상관 없이 꽥꽥거리기만 한다면 오리로 본다는 개념이므로 덕(오리) 타이핑이라는 이름이 붙었습니다.
빈 인터페이스와 Type assert빈 인터페이스에는 모든 자료형을 저장할 수 있습니다. 단, 값을 꺼낼 때는 Type assert를 사용합니다.
var ifce1 interface{} = 1
var ifce2 interface{} = "Hello, world!"
var num1 int = ifce1.(int)
var s1 string = ifce2.(string)
fmt.Println(num1, s1) // 1 Hello, world!
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.