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 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) #----------------------------------------------------------------------------
|