go version go1.18 windows/amd64

구조

 

main.go
package main

import (
    "fmt"
    banking "scraping/structExample/main/detail"
)

/* main의 의미 : 컴파일을 위해 필요한 것!
   명령어 go run main.go 뜻
   1. main package 찾음
   2. main function 찾고 실행 */
func main() {

    // fmt : formattiing  을 위한 패키지, Print의 "P"가 대문자인 이유는 function을 export 하겠다는 의미
    fmt.Println("GO 에서 Constructor 와 Method 사용")

    // [01] GO 에서 Constructor를 만드는 방법
    a := banking.NewAccount("Donz")
    fmt.Println(a) // <- 결과를 출력해 보면 요렇게 &{a 0} 주소표시가 붙어있음, a는 복사본이 아니라 object라는 뜻임
    // fmt.Println(a) 에서 콘솔에 "&{a 0}" 요렇게 표현해 주는 것은 String() 펑션 때문임, 출력형태 변경가능니 맨아래 참조

    // [02] GO 에서 Method 사용 방법
    a.Deposit(10)
    a.Balance()

    // [03] GO 에서 try-catch 처리
    e := a.Withdraw(11)
    if e != nil {
        fmt.Println(e.Error())
    }
}
anything_banking_file.go
package anything_banking_package

import (
    "errors"
    "fmt"
)

// 앞글자 a가 소문자라서 private: 파일내부에서만 사용가능
type account struct {
    owner   string
    balance int
}

/* 새로운 object를 리턴하고 싶은데, object를 만들긴 싫으니 복사본 자체를 return 함
   새로 만들어진 object를 보내는 거,  &:주소 / *:주소에 담긴값을 살펴봄 */
func NewAccount(owner string) *account {
    a := account{owner: owner, balance: 0}
    fmt.Println("a balance :", a.balance, &a.balance) // <- 0xc000004088
    return &a
}

/* GO의 Method 만드는 방법
   func와 func명 사이에 account의 b와 b의 type을 기입,
(b account) 부분을 receiver라고 하고 reciever는 b */
func (b *account) Deposit(amount int) {
    /* (*account) 뜻 : 누군가가 main.go의 a.Deposit을 호출한다면, Deposit method를 호출한 account를 사용하라는 거임 */
    b.balance += amount
    fmt.Println("b balance :", b.balance, &b.balance) // <- 0xc000004088
}

// main의 account를 여기로 가지고 와서 c로 복사본을 만듬
func (c account) Balance() int {
    fmt.Println("c balance :", c.balance, &c.balance) // <- 0xc0000040b8
    return c.balance
}

/* GO 는 try-catch가 없고 에러처리가 필요한 부분은 개발자가 이렇게 해줘야 함
   errors.New("Can't withdraw") 를 리턴하고, 받는 쪽에서 표현 */
func errWithdrwa() error {
    return errors.New("Can't withdraw")
}
func (d *account) Withdraw(amount int) error {
    if d.balance-amount < 0 {
        return errWithdrwa()
    } else {
        fmt.Println("d balance :", d.balance, &d.balance) // <- 0xc000004088
        d.balance -= amount
    }
    return nil
}
 
// GO 가 자동으로 호출해주는 method (fmt.Println 명령어 사용시 아래의 형태로 변형되어 표현됨)
func (a *account) String() string {
    return fmt.Sprint(a.owner, "'s account.\nHas :", a.balance)
}
mod.go
module scraping/structExample/main

go 1.18

+ Recent posts