Go 語言面向對象保姆級教程!

哈嘍,大家好,我是 Go 大叔,專注分享 Go 語言知識,一起進入 Go 的大門。

大叔和身邊一羣大牛都無限看好 Go 語言,現在開始搞 Go 語言,過兩年大概就是第一批喫螃蟹的人。

面向對象基本概念

面向對象思想

面向對象和麪向過程區別

面向對象的特點

類與對象的關係

如何設計一個類

事物名稱(類名):人(Person)
屬性:身高(height)、年齡(age)
行爲(功能):跑(run)、打架(fight)

如何分析一個類

飛機
炮彈
裝甲車
老王
熱狗
草泥馬

如何定義一個類

type Person struct {
    name string // 人的屬性
    age int // 人的屬性
}
// 人的行爲
func (p Person)Say()  {
    fmt.Println("my name is", p.name, "my age is", p.age)
}

如何通過類創建一個對象

// 3.創建一個結構體變量
    p1 := Person{"lnj", 33}
    per.say()

    p2 := Person{"zs", 18}
    per.Say()

不同包中變量、函數、方法、類型公私有問題

package demo

import "fmt"

var num1 int = 123 // 當前包可用
var Num1 int = 123 // 其它包也可用

type person struct { // 當前包可用
 name string // 當前包可用
 age int // 當前包可用
}

type Student struct { // 其它包也可用
 Name string // 其它包也可用
 Age int // 其它包也可用
}

func test1()  { // 當前包可用
 fmt.Println("test1")
}
func Test2()  { // 其它包也可用
 fmt.Println("Test2")
}

func (p person)say()  { // 當前包可用
 fmt.Println(p.name, p.age)
}
func (s Student)Say()  { // 其它包也可用
 fmt.Println(s.Name, s.Age)
}

面向對象三大特性

package model
import "fmt"
type Person struct { // 其它包也可用
 name string // 當前包可用
 age int // 當前包可用
}
func (p *person)SetAge(age int)  {
 // 安全校驗
 if age < 0 {
  fmt.Println("年齡不能爲負數")
 }
 p.age = age
}
package main
import (
 "fmt"
 "main/model"
)
func main()  {
 // 報錯, 因爲name和age不是公開的
 //p := model.Person{"lnj", 18}

 // 方式一
 //p := model.Person{}
 //p.SetAge(18)
 //fmt.Println(p)

 // 方式二
 //p := new(model.Person)
 //p.SetAge(18)
 //fmt.Println(p)
}
package main

import "fmt"

type Person struct {
 name string
 age int
}
type Student struct {
 Person // 學生繼承了人的特性
 score int
}
type Teacher struct {
 Person // 老師繼承了人的特性
 Title string
}
func main()  {
 s := Student{Person{"lnj", 18}, 99}
 //fmt.Println(s.Person.name)
 fmt.Println(s.name) // 兩種方式都能訪問
 //fmt.Println(s.Person.age)
 fmt.Println(s.age) // 兩種方式都能訪問
 fmt.Println(s.score)
}
package main

import "fmt"

type Person struct {
 name string // 屬性重名
 age int
}
type Student struct {
 Person
 name string // 屬性重名
 score int
}
func main()  {
 s := Student{Person{"zs", 18}"ls", 99}

 fmt.Println(s.Person.name) // zs
 fmt.Println(s.name) // ls
 //fmt.Println(s.Person.age)
 fmt.Println(s.age) // 兩種方式都能訪問
 fmt.Println(s.score)
}
package main

import "fmt"

type Object struct {
 life int
}
type Person struct {
 Object
 name string
 age int
}
type Student struct {
 Person
 score int
}
func main()  {
 s := Student{Person{Object{77}"zs", 33}, 99}
 //fmt.Println(s.Person.Object.life)
 //fmt.Println(s.Person.life)
 fmt.Println(s.life) // 三種方式都可以
 //fmt.Println(s.Person.name)
 fmt.Println(s.name) // 兩種方式都能訪問
 //fmt.Println(s.Person.age)
 fmt.Println(s.age) // 兩種方式都能訪問
 fmt.Println(s.score)
}
package main

import "fmt"

type Object struct {
 life int
}
type Person struct {
 name string
 age int
}
type Student struct {
 Object
 Person
 score int
}
func main()  {
 s := Student{Object{77}, Person{"zs", 33}, 99}
 //fmt.Println(s.Person.life)
 fmt.Println(s.life) // 兩種方式都可以
 //fmt.Println(s.Person.name)
 fmt.Println(s.name) // 兩種方式都能訪問
 //fmt.Println(s.Person.age)
 fmt.Println(s.age) // 兩種方式都能訪問
 fmt.Println(s.score)
package main

import "fmt"
type Person struct {
 name string
 age int
}
// 父類方法
func (p Person)say()  {
 fmt.Println("name is ", p.name, "age is ", p.age)
}

type Student struct {
 Person
 score float32
} 

func main() {
 stu := Student{Person{"zs", 18}, 59.9}
 stu.say()
}
package main

import "fmt"
type Person struct {
 name string
 age int
}
// 父類方法
func (p Person)say()  {
 fmt.Println("name is ", p.name, "age is ", p.age)
}

type Student struct {
 Person
 score float32
}
// 子類方法
func (s Student)say()  {
 fmt.Println("name is ", s.name, "age is ", s.age, "score is ", s.score)
}
func main() {
 stu := Student{Person{"zs", 18}, 59.9}
 // 和屬性一樣, 訪問時採用就近原則
 stu.say() 
 // 和屬性一樣, 方法同名時可以通過指定父類名稱的方式, 訪問父類方法
 stu.Person.say()
}
貓: 貓-->動物
狗: 狗-->動物
男人 : 男人 -->人 -->高級動物
女人 : 女人 -->人 -->高級動物
package main

import "fmt"
// 1.定義接口
type Animal interface { 
 Eat()
}
type Dog struct {
 name string
 age int
}
// 2.實現接口方法
func (d Dog)Eat()  {
 fmt.Println(d.name, "正在喫東西")
}

type Cat struct {
 name string
 age int
}
// 2.實現接口方法
func (c Cat)Eat()  {
 fmt.Println(c.name, "正在喫東西")
}
// 3.對象特有方法
func (c Cat)Special()  {
 fmt.Println(c.name, "特有方法")
}

func main()  {
 // 1.利用接口類型保存實現了所有接口方法的對象
 var a Animal
 a = Dog{"旺財", 18}
 // 2.利用接口類型調用對象中實現的方法
 a.Eat()
 a = Cat{"喵喵", 18}
 a.Eat()
 // 3.利用接口類型調用對象特有的方法
 //a.Special() // 接口類型只能調用接口中聲明的方法, 不能調用對象特有方法
 if cat, ok := a.(Cat); ok{
  cat.Special() // 只有對象本身才能調用對象的特有方法
 }
}

一個人走的太慢,一羣人才能走的更遠。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/__UUZFFSnNq_4uwUzIT2mA