Server/Go
Go) Struct 이해하기
Juzdalua
2022. 11. 22. 15:24
파스칼 케이스로 export를 연습했다.
receiver, pointer, error handling을 연습했다.
// learngo/accounts/accounts.go
package accounts
import (
"errors"
"fmt"
)
type PublicAccount struct {
Owner string
Balance int
}
type privateAccount struct {
owner string
balance int
}
var errNoMoney = errors.New("can't withdraw")
// contstuctor
func NewAccount(owner string) *privateAccount {
account := privateAccount{owner: owner, balance: 0}
return &account
}
// method - use receiver
// receiver name must struct's first alpahbet lowercase
// receiver always make copy. we must use real receiver data with *
func (p *privateAccount) Deposit(amount int) {
p.balance += amount
}
// if we not change value, we can use copy receiver
func (p privateAccount) Balance() int {
return p.balance
}
func (p *privateAccount) Withdraw(amount int) error {
// error handling
if p.balance < amount {
return errNoMoney
}
p.balance -= amount
return nil // like null
}
func (p privateAccount) Owner() string {
return p.owner
}
func (p privateAccount) String() string {
return fmt.Sprintln(p.Owner(), "'s account.\nHas: ", p.Balance())
}
//learngo/main.go
package main
import (
"fmt"
"log"
"github.com/juzdalua/learngo/accounts"
)
func main(){
publicAccount := accounts.PublicAccount{Owner: "jun", Balance: 1000}
fmt.Println(publicAccount)
privateAccount := accounts.NewAccount("JUN")
fmt.Println(privateAccount)
privateAccount.Deposit(1000)
fmt.Println(privateAccount.Balance())
privateAccount.Withdraw(500)
fmt.Println(privateAccount.Balance())
fmt.Println(privateAccount.String())
// Go can't use try-catch. we check error
if err := privateAccount.Withdraw(600); err != nil {
log.Fatalln(err)
}
}