Notice
Recent Posts
Recent Comments
Link
오늘의하루
[Go 기초] 얕은 복사? Error? 본문
반응형
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() 메소드를 호출하여 에러 메시지를 출력합니다.
반응형
'코딩공부' 카테고리의 다른 글
[MySQL 8.0] 선착순 쿠폰 발급 로직 구현에 대한 고찰 (0) | 2025.01.28 |
---|---|
AOP를 통한 유지 보수성 향상 - 프로젝트의 매개변수 관리 혁신 (0) | 2024.09.22 |
각 화면의 기능을 공통 인터페이스로 분리 (0) | 2024.09.21 |
[AUIGrid] XSS 취약점 발견 및 해결 과정 (0) | 2024.09.21 |
[Oracle] SQL Function 복습 (0) | 2023.02.26 |
Comments