-
[Go 기초] 얕은 복사? Error?코딩공부 2025. 1. 22. 18:23728x90반응형
Go 언어에서 값 타입은 복사할 때 깊은 복사가 이루어지며 참조 타입은 얕은 복사가 이루어집니다.
1. 값 타입 (Value Type)
값 타입은 변수에 할당될 때 값 자체가 복사(깊은 복사)됩니다.
- Go에서 기본적으로 제공하는 값 타입으로는 int, float, struct 등이 있습니다.
package main import "fmt" type Jang struct { X, Y int } func (j *Jang) Jangto(i int) { j.X = j.X * i j.Y = j.Y * i } func JangTest() { originV := Jang{1, 2} copyV := originV // 깊은 복사 copyV.Jangto(2) fmt.Println("origin = ", originV) // 1, 2 fmt.Println("copy = ", copyV) // 2, 4 } func main() { JangTest() }- originV와 copyV는 서로 독립적인 값입니다.
- copyV를 변경하더라도 originV에는 영향을 미치지 않습니다.
2. 참조 타입 (Reference Type)
참조 타입은 변수에 할당될 때 주소값이 복사(얕은 복사)됩니다.
- Go에서 참조 타입으로는 pointer, slice, map, channel, interface 등이 있습니다.
package main import "fmt" type Jang struct { X, Y int } func (j *Jang) Jangto(i int) { j.X = j.X * i j.Y = j.Y * i } func JangTest() { originV := Jang{1, 2} copyV := &originV // 포인터로 주소값을 할당 copyV.Jangto(2) fmt.Println("origin = ", originV) // 2, 4 fmt.Println("copy = ", *copyV) // 2, 4 } func main() { JangTest() }- copyV가 originV의 주소를 가리킵니다.
- copyV를 변경하면 originV도 동시에 변경됩니다.
Go에서 error 타입의 동작
Go에서 error 타입은 interface 타입으로 Error() 메소드를 구현한 모든 타입을 에러로 취급할 수 있습니다.
fmt.Println 등에서 error 타입을 출력하면 자동으로 Error() 메소드가 호출되는데 이는 fmt.Println이 error 인터페이스를 처리하는 방식입니다.
fmt.Println과 error 타입
fmt.Println 함수는 error 타입을 출력할 때 자동으로 Error() 메소드를 호출합니다.
이 메소드는 에러 메시지를 문자열로 변환하여 출력하는 역할을 하기 때문에 Error() 메소드를 명시적으로 호출할 필요 없이 error 타입을 출력하면 내부적으로 Error() 메소드가 실행됩니다.
package main import ( "fmt" "time" ) type MyError struct { When time.Time What string } func (e *MyError) Error() string { return fmt.Sprintf("at %v, %s", e.When, e.What) } func run() error { return &MyError{time.Now(), "error!!!!"} } func main() { if err := run(); err != nil { fmt.Println(err) // 자동으로 Error() 호출됨 } }fmt.Println의 doPrintln 내부 동작
fmt.Println 함수는 내부적으로 doPrintln이라는 함수에서 동작합니다.
이 함수는 인자로 전달된 값이 error 타입인 경우 자동으로 해당 타입의 Error() 메소드를 호출하여 에러 메시지를 출력합니다.
728x90반응형'코딩공부' 카테고리의 다른 글
[MySQL 8.0] 선착순 쿠폰 발급 로직 구현에 대한 고찰 (0) 2025.01.28 AOP를 통한 유지 보수성 향상 - 프로젝트의 매개변수 관리 혁신 (2) 2024.09.22 각 화면의 기능을 공통 인터페이스로 분리 (0) 2024.09.21 [AUIGrid] XSS 취약점 발견 및 해결 과정 (0) 2024.09.21 [Oracle] SQL Function 복습 (0) 2023.02.26