| 12
 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
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 
 | 1.Go语言支持面向对象编程(OOP,Object-orientedprogramming)。虽然Go语言不是严格的面向对象编程语言。2.Go语言中的结构体(struct)与其它语言中的类(class)在面向对象编程中处于同等地位。
 3.Go语言中没有严格的继承、方法重载、构造函数等。
 4.Go语言通过接口(interface)完成面向对象编程。
 
 5.对象实战案例
 #----------------------------------------------------------------------------
 package main
 
 import "fmt"
 
 
 
 type Person struct {
 Name   string
 Sex    string
 Tall   float64
 Weight float64
 Age    int
 }
 
 func inputPeopleInfo() {
 
 
 person := []Person{
 {
 "jesse",
 "男",
 float64(1.75),
 float64(70),
 27,
 },
 {
 "jesse1",
 "男1",
 float64(1.76),
 float64(71),
 28,
 },
 }
 
 for _,items := range person{
 fmt.Println(items)
 }
 }
 
 func main()  {
 inputPeopleInfo()
 }
 #----------------------------------------------------------------------------
 
 6.为什么要有struct
 当一组数据总是围绕着某个主体时,表示这些数据与这个主体之间有紧密的关联关系,可将该主体提
 取为一个对象,围绕着主体的数据为这个对象的属性,围绕着这些数据的操作即为该主体的成员函数。
 Go 语言中,对象的体现方式为结构体(struct)。
 
 7.怎么定义结构体变量?
 var <变量名> [*]<变量类型>
 var tom Person
 var tom *Person
 <变量名> := [&]<变量类型>{}
 tom := Person{}
 tom := &Person{}
 <变量名> := [&]<变量类型>{[ [属性名]:[属性值] ]}
 tom := &Person{"Tom”, 23}
 tom := &Person{Name: "Tom”, Age: 23}
 var <变量名> *<变量类型> = new(Person)
 var tom *Person = new(Person)
 8.结构体的操作
 - 结构体的属性在同一个包内均可见
 - 只有公有的结构体、成员变量、成员函数在包外部可见
 - 结构体的成员函数执行时,只能通过结构体指针的成员函数进行更改
 
 9.结构体的嵌套
 - 结构体的嵌套是指直接嵌入其他结构体完成结构体的定义。
 - 被嵌入的结构体的所有成员变量、成员方法都可以直接被使用。
 - 注意:
 - 被嵌入的结构体的成员变量、成员函数也遵循公有、私有访问限制。
 - 在创建变量时,嵌入的对象也需要实例化,尤其是引用类型。如:指针类型、Map。
 
 10.结构体的嵌套实例化一
 #----------------------------------------------------------------------------
 package calc
 
 type Calculator struct {
 Left, Right int
 Result      int
 }
 
 type NewCalculator struct {
 old Calculator
 }
 
 func getNewCalculator() *NewCalculator {
 return &NewCalculator{}
 }
 
 type NewCalculator2 struct {
 old *Calculator
 }
 
 func getNewCalculator2() *NewCalculator2 {
 return &NewCalculator2{old: &Calculator{}}
 
 }
 #----------------------------------------------------------------------------
 
 11.结构体的嵌套实例化二
 #----------------------------------------------------------------------------
 package main
 
 import (
 "fmt"
 )
 
 type Calculator struct {
 Left, Right int
 
 Result      int
 }
 
 
 type NewCalculator struct {
 Calculator
 }
 
 
 type PointCalcularor struct {
 old *Calculator
 }
 
 
 func (c *Calculator) Add() int {
 tmpResult := c.Left + c.Right
 c.Result = tmpResult
 fmt.Printf("c.result = %v\n",c.Result)
 return tmpResult
 }
 
 func (c *Calculator) Sub() int {
 return c.Left - c.Right
 }
 
 func (c *Calculator) Multiple() int {
 return c.Left * c.Right
 }
 
 func (c *Calculator) Divide() int {
 return c.Left / c.Right
 }
 
 func (c *Calculator) Remainder() int {
 return c.Left % c.Right
 }
 
 func calcFunc() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 var c = &Calculator{
 Left: 1,
 Right: 11,
 }
 
 fmt.Println(c.Add())
 
 
 newC := &NewCalculator{}
 newC.Left = 999
 newC.Right = 888
 fmt.Println(newC.Add())
 
 
 pointC := &PointCalcularor{old:&Calculator{
 Left: 999,
 Right: 876,
 }}
 
 
 
 fmt.Println(pointC.old.Add())
 fmt.Println("pointC:",pointC.old.Add())
 }
 
 
 
 type MyCommand struct {
 mainCommand *string
 commandOptions map[string]string
 }
 
 func (m *MyCommand) ToCmdStr() string {
 
 out := ""
 for k,v := range m.commandOptions{
 out = out + fmt.Sprintf("--%s=%s",k,v)
 }
 return out
 }
 
 func testCmd(){
 mc := &MyCommand{
 new(string),
 make(map[string]string),
 }
 
 mc.commandOptions["author"]="jesse"
 *mc.mainCommand="myPointType"
 fmt.Println(*mc.mainCommand)
 fmt.Println(mc.ToCmdStr())
 }
 
 
 func main() {
 
 testCmd()
 }
 #----------------------------------------------------------------------------
 
 12.sort.Slice测试案例
 
 main.go
 #----------------------------------------------------------------------------
 package main
 
 import (
 "fmt"
 "sort"
 )
 
 type Peopel struct {
 Name string
 Age int
 }
 
 func InitPeople()(arrs []Peopel){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 arrs = []Peopel{
 {
 "jesse",
 23,
 },
 {
 "maggie",
 21,
 },
 {
 "gina",
 29,
 },
 {
 "rainbow",
 31,
 },
 }
 return
 }
 
 func main(){
 arrs := InitPeople()
 fmt.Println("before:",arrs)
 sort.Slice(arrs, func(i, j int) bool {
 
 return arrs[i].Age < arrs[j].Age
 })
 fmt.Println("按照年龄 从小到大排列:",arrs)
 #----------------------------------------------------------------------------
 
 |