구조체 변수들의 집합, JS에는 업지만 솔리디티에서 좀 써봣다.
Go는 클래스가 업기 때문에 구조체를 클래스처럼 쓰므로 잘 기억해두자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package mainimport "fmt" type user struct { id string name string password string } func main () { a := user{} a.id = "emma" a.name = "엠마" a.password = "neverland" fmt.Println(a) fmt.Println(a.id) b := new (user) b.id = "luffy" b.name = "루피" b.password = "onepiece" fmt.Println(b) fmt.Println(b.id) }
생성자 구조체를 사용전에 초기화 할 필요가 있을 시 생성자 함수로 만들어서 사용을 할 수 있다고 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package mainimport "fmt" type con struct { data map [string ]string } func newCon () *con { c := con{} c.data = make (map [string ]string ) return &c } func main () { c := newCon() c.data["a" ] = "A" fmt.Println(c) fmt.Println(*c) fmt.Println(c.data["a" ]) d := newCon() d.data["b" ] = "B" fmt.Println(d.data) fmt.Println(d.data["b" ]) }
메소드 위에서도 썻지만 Go는 클래스가 업기 때문에 구조체, 메소드로 OOP ㄱㄱ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package mainimport "fmt" type User struct { id string name string age uint8 } func (u User) getId () string { return u.id } func (u User) getName () string { return u.name } func (u User) getAge () uint8 { return u.age } func main () { user := User{"oneforall" , "allforone" , 99 } id := user.getId() name := user.getName() age := user.getAge() fmt.Println(id, name, age) }
포인터 메소드 함수를 만들 때 구조체를 포인터로 받을 수 있다.
포인터니깐.. 구조체의 원본이 당연히 달라진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package mainimport "fmt" type Cal struct { first int second int } func (c Cal) plus () int { c.first = c.first + c.second return c.first + c.second } func (c Cal) multiply () int { return c.first * c.second } func (c *Cal) plus2 () int { c.first = c.first + c.second return c.first + c.second } func (c *Cal) multiply2 () int { return c.first * c.second } func main () { cal := Cal{1 , 5 } plus := cal.plus() fmt.Println("plus" , plus) multi := cal.multiply() fmt.Println("multi_1" , multi) cal2 := Cal{1 , 5 } plus2 := cal2.plus2() fmt.Println("plus2" , plus2) multi2 := cal2.multiply2() fmt.Println("multi2" , multi2) }
인터페이스 구조체가 변수들의 집합이라면 인터페이스는 메소드들의 집합이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 package mainimport "fmt" type cal interface { plus() int multiply() int } type one struct { first int second int } type two struct { first int second int } func (a one) plus () int { return a.first + a.second } func (a one) multiply () int { return a.first * a.second } func (b two) plus () int { return b.first + b.second } func (b two) multiply () int { return b.first * b.second } func showArea (cal ...cal) { for _, s := range cal { a := s.plus() fmt.Println(a) } } func main () { a := one{1 , 5 } b := two{10 , 50 } showArea(a, b) }
데이터 타입 인터페이스를 다이나믹 타입이라 해서 데이터 타입으로 쓸 수 잇다.
JS Object랑 비슷해보임, 위보단 이 쪽으로 마니 쓸 거 같은 느낌 아닌 느낌..?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package mainimport "fmt" func main () { v := []interface {}{ 1 , true , "hi" , "golang" , } for _, item := range v { fmt.Println("val:" , item) } m := map [string ]interface {}{ "a" : "hi" , "b" : true , "c" : 33 , "d" : []interface {}{ "array1" , "array2" , }, "e" : map [string ]interface {}{ "x" : "x" , "y" : "y" , "z" : "z" , }, } fmt.Println(m) }
다음에 이어서 ㄱ