package main
import "fmt"
type Account struct {
number string
balance float64
interest float64
}
func (a Account) Calculate() float64 {
return a.balance + (a.balance * a.interest)
}
func main() {
//구조체
//Go의 필드들의 집합체 또는 컨테이너
//필드는 갖지만 메소드는 갖지 않는다.
//객체지향 방식을 지원 -> 리시버를 통해 메소드랑 연결
//상속, 객체, 클래스 개념 없음
//구조체 -> 구조체 선언 -> 구조체 인스턴스(리시버)
//예제1
kim := Account{number: "245-901", balance: 10000000, interest: 0.015}
lee := Account{number: "245-902", balance: 12000000} //기본값 0 초기화
park := Account{number: "245-903", interest: 0.025}
cho := Account{"245-904", 15000000, 0.03}
fmt.Println("ex1 : ", kim)
fmt.Println("ex1 : ", lee)
fmt.Println("ex1 : ", park)
fmt.Println("ex1 : ", cho)
fmt.Println()
//예제2
fmt.Println("ex2 : ", int(kim.Calculate()))
fmt.Println("ex2 : ", int(lee.Calculate()))
fmt.Println("ex2 : ", int(park.Calculate()))
fmt.Println("ex2 : ", int(cho.Calculate()))
}
package main
import "fmt"
type Account struct {
number string
balance float64
interest float64
}
func (a Account) Calculate() float64 {
return a.balance + (a.balance * a.interest)
}
func main() {
//예제1
//선언 방법1
var kim *Account = new(Account)
kim.number = "245-901"
kim.balance = 10000000
kim.interest = 0.015
//선언 방법2
hong := &Account{number: "245-902", balance: 15000000, interest: 0.04}
//선언 방법3
lee := new(Account)
lee.number = "245-903"
lee.balance = 13000000
lee.interest = 0.025
fmt.Println("ex1 : ", kim)
fmt.Println("ex1 : ", hong)
fmt.Println("ex1 : ", lee)
fmt.Printf("ex1 : %#v\n", kim)
fmt.Printf("ex1 : %#v\n", hong)
fmt.Printf("ex1 : %#v\n", lee)
fmt.Println()
//예제2
fmt.Println("ex2 : ", int(kim.Calculate()))
fmt.Println("ex2 : ", int(hong.Calculate()))
fmt.Println("ex2 : ", int(lee.Calculate()))
}
package main
import "fmt"
type car struct {
color string
name string
}
func main() {
//예제1
//함수의 매개변수로 전달시에는 기본적으로 값 복사 이므로, 필요시 포인터로 전달해야 한다.
c1 := car{"red", "220d"}
c2 := new(car)
c2.color, c2.name = "white", "sonata"
c3 := &car{}
c4 := &car{"black", "520d"}
fmt.Println(c1)
fmt.Println(c2)
fmt.Println(c3)
fmt.Println(c4)
fmt.Println()
}
package main
import "fmt"
func main() {
//구조체 익명 선언 및 활용
//예제1
car1 := struct{ name, color string }{"520d", "red"}
fmt.Println("ex1 : ", car1)
fmt.Printf("ex1 : %#v\n", car1)
//예제2
cars := []struct{ name, color string } { {"520d", "red"}, {"220d", "white"}, {"420d", "black"} }
for _, c := range cars {
fmt.Printf("(%s, %s) ----- (%#v)\n", c.name, c.color, c)
}
}
package main
import "fmt"
import "reflect"
type Car struct {
name string "차량명"
color string "색상"
company string "제조사"
}
func main() {
//필드 태그 사용
//예제1
tag := reflect.TypeOf(Car{})
for i := 0; i < tag.NumField(); i++ {
fmt.Println("ex1 : ", tag.Field(i).Tag, tag.Field(i).Name, tag.Field(i).Type)
}
}
package main
import "fmt"
type spec struct { //소문자로 선언
length int "전장"
height int "전고"
width int "전축"
}
type Car struct { //대문자로 선언
name string
color string
company string
detail spec
}
func main() {
//중첩 구조체
//예제1
car1 := Car{
"520d",
"silver",
"bmw",
spec{4000, 1000, 2000},
}
// 내부 spec 구조체 값 출력
fmt.Println("ex1 : ", car1.name)
fmt.Println("ex1 : ", car1.color)
fmt.Println("ex1 : ", car1.company)
fmt.Printf("ex1 : %#v\n", car1.detail)
fmt.Println()
//예제2
// 내부 spec 구조체 필드 값 출력
fmt.Println("ex2 : ", car1.detail.length)
fmt.Println("ex2 : ", car1.detail.height)
fmt.Println("ex2 : ", car1.detail.width)
}