@@ -237,6 +237,39 @@ error可以假装理解为内置的类型(实际是接口),返回时errors.New("
|
237 | 237 | - 类函数
|
238 | 238 |
|
239 | 239 | - interface
|
| 240 | +```go |
| 241 | + |
| 242 | +package main |
| 243 | + |
| 244 | +import "fmt" |
| 245 | + |
| 246 | +type Animal interface { |
| 247 | +Grow() |
| 248 | +Move(string) string |
| 249 | +} |
| 250 | +type Cat struct{ |
| 251 | +Name string |
| 252 | +Age int32 |
| 253 | +Address string |
| 254 | +} |
| 255 | +func (cat *Cat) Grow(){ |
| 256 | +cat.Age++ |
| 257 | +} |
| 258 | +func (cat *Cat)Move(newAdddress string)(oldAddress string){ |
| 259 | +oldAddress = cat.Address |
| 260 | +cat.Address = newAdddress |
| 261 | +return |
| 262 | +} |
| 263 | + |
| 264 | +func main() { |
| 265 | +myCat := Cat{"Little C", 2, "In the house"} |
| 266 | +animal, ok := interface{}(&myCat).(Animal) |
| 267 | +animal.Grow() |
| 268 | +fmt.Printf("%v, %v\n", ok, animal) |
| 269 | +} |
| 270 | +true, &{Little C 3 In the house} |
| 271 | + |
| 272 | +``` |
240 | 273 | >按照约定,只包含一个方法的接口应当以该方法的名称加上-er后缀或类似的修饰来构造一个施动着名词,如 Reader、Writer、 Formatter、CloseNotifier 等。
|
241 | 274 |
|
242 | 275 | ## defer
|
@@ -253,13 +286,156 @@ defer file.Close()
|
253 | 286 | ```
|
254 | 287 |
|
255 | 288 | ## go
|
256 |
| - |
| 289 | +go 相当轻量级线程,其实是croutine的go实现.相当golang语言本身集成了线程库的一些工程. |
257 | 290 | ## chan
|
258 |
| - |
| 291 | +简单理解:通道的目的就是为了go程序线程同步用的 |
259 | 292 | ## make
|
260 | 293 | >内建函数 make(T, args) 的目的不同于 new(T)。它只用于创建切片、映射和信道,并返回类型为 T(而非 *T)的一个已初始化 (而非置零)的值。 出现这种用差异的原因在于,这三种类型本质上为引用数据类型,它们在使用前必须初始化。 例如,切片是一个具有三项内容的描述符,包含一个指向(数组内部)数据的指针、长度以及容量, 在这三项被初始化之前,该切片为 nil。对于切片、映射和信道,make 用于初始化其内部的数据结构并准备好将要使用的值。
|
261 | 294 |
|
| 295 | +go chan make slice 综合小例子 |
| 296 | +```go |
| 297 | + |
| 298 | +package main |
| 299 | + |
| 300 | +import "fmt" |
| 301 | + |
| 302 | +func sum(a []int, c chan int) { |
| 303 | +sum := 0 |
| 304 | +for _, v := range a { |
| 305 | +sum += v |
| 306 | +} |
| 307 | +c <- sum //将和送入c |
| 308 | +} |
| 309 | + |
| 310 | +func main() { |
| 311 | +a := []int{1, 2, 3, 4, 5, 6} |
| 312 | + |
| 313 | +c := make(chan int) |
| 314 | + |
| 315 | +go sum(a[len(a)/2:], c) |
| 316 | +go sum(a[:len(a)/2], c) |
| 317 | + |
| 318 | +x, y := <-c, <-c //从c中获取 |
| 319 | + |
| 320 | +fmt.Println(x,"+", y,"=", x+y) |
| 321 | +} |
| 322 | + |
| 323 | + |
| 324 | +``` |
262 | 325 | ## 恐慌panic与恢复recover
|
| 326 | +类似c++,java中的异常.panic就是抛出异常,recover就是捕获异常. |
| 327 | +```go |
| 328 | + |
| 329 | +package main |
| 330 | + |
| 331 | +import ( |
| 332 | +"errors" |
| 333 | +"fmt" |
| 334 | +) |
| 335 | + |
| 336 | +func innerFunc() { |
| 337 | +defer func(){ //尝试移动本段代码查看效果 |
| 338 | +if p:=recover(); p!=nil{ |
| 339 | +fmt.Printf("Fatal error: %s\n",p) |
| 340 | +} |
| 341 | +}() |
| 342 | +fmt.Println("Enter innerFunc") |
| 343 | +panic(errors.New("Occur a panic!")) |
| 344 | +fmt.Println("Quit innerFunc") |
| 345 | +} |
| 346 | + |
| 347 | +func outerFunc() { |
| 348 | + |
| 349 | +fmt.Println("Enter outerFunc") |
| 350 | +innerFunc() |
| 351 | +fmt.Println("Quit outerFunc") |
| 352 | +} |
| 353 | + |
| 354 | +func main() { |
| 355 | +fmt.Println("Enter main") |
| 356 | +outerFunc() |
| 357 | +fmt.Println("Quit main") |
| 358 | +} |
| 359 | + |
| 360 | +Enter main |
| 361 | +Enter outerFunc |
| 362 | +Enter innerFunc |
| 363 | +Fatal error: Occur a panic! |
| 364 | +Quit outerFunc |
| 365 | +Quit main |
| 366 | + |
| 367 | + |
| 368 | +``` |
| 369 | + |
| 370 | +# 第三章 从写些小工具开始 |
| 371 | + |
| 372 | +- 字符串操作 |
| 373 | +```go |
| 374 | + |
| 375 | +package main |
| 376 | + |
| 377 | +import ( |
| 378 | +"fmt" |
| 379 | +"strings" |
| 380 | +) |
| 381 | + |
| 382 | +func main() { |
| 383 | +name := "harry potty" |
| 384 | +arr := strings.Split(name, " ") |
| 385 | +fmt.Println(arr) |
| 386 | +arr2 := strings.Join(arr, "#") |
| 387 | +fmt.Println(arr2) |
| 388 | +str := strings.Replace(name, "harry", "\\t", -1) |
| 389 | +fmt.Println(str) |
| 390 | +} |
| 391 | + |
| 392 | +[harry potty] |
| 393 | +harry#potty |
| 394 | +\t potty |
| 395 | + |
| 396 | + |
| 397 | +``` |
| 398 | +- json操作 |
| 399 | + |
| 400 | +```go |
| 401 | + |
| 402 | +package main |
| 403 | + |
| 404 | +import ( |
| 405 | +"encoding/json" |
| 406 | +"fmt" |
| 407 | +) |
| 408 | + |
| 409 | +type Person struct { |
| 410 | +Name string |
| 411 | +Age int |
| 412 | +} |
| 413 | +type Girl struct { |
| 414 | +Person Person |
| 415 | +Sex bool |
| 416 | +} |
| 417 | + |
| 418 | +func main() { |
| 419 | +defer func() { |
| 420 | +fmt.Println("程序结束了") |
| 421 | +}() |
| 422 | +person := Person{"胡彦春", 18} |
| 423 | +gilr := Girl{person, true} |
| 424 | +b, err := json.Marshal(gilr) |
| 425 | +if err != nil { |
| 426 | +fmt.Print(err) |
| 427 | +} |
| 428 | +fmt.Print(string(b)) |
| 429 | + |
| 430 | +} |
| 431 | + |
| 432 | +{"Person":{"Name":"胡彦春","Age":18},"Sex":true}程序结束了 |
| 433 | + |
| 434 | +``` |
| 435 | + |
| 436 | +- 文件操作 |
| 437 | + |
| 438 | +- websocket |
263 | 439 |
|
264 |
| -# 第三章 从写个工具开始 |
| 440 | +- options |
265 | 441 |
|
0 commit comments