一.go语言的面向对象
例子:银行的取款和存款代码:
package main
import (
"fmt"
)
type Yinghang struct {
Account string
Pwd string
Balance int
}
func (p *Yinghang) qukuan(Account string, Pwd string, Balance int) {
if p.Account != Account {
fmt.Println("用户不存在")
return
}
if Pwd != p.Pwd {
fmt.Println("密码错误")
return
}
if (p.Balance - Balance) < 0 {
fmt.Println("余额不足")
return
}
p.Balance = p.Balance - Balance
fmt.Printf("帐互:%v 当前余额:%v", p.Account, p.Balance)
return
}
func (p *Yinghang) chuekuan(Account string, Pwd string, Balance int) {
if p.Account != Account {
fmt.Println("用户不存在")
return
}
if Pwd != p.Pwd {
fmt.Println("密码错误")
return
}
p.Balance = p.Balance + Balance
fmt.Printf("帐互:%v 当前余额:%v", p.Account, p.Balance)
return
}
func main() {
user1 := Yinghang{
Account: "198123456",
Pwd: "000111",
Balance: 3000,
}
var caozuo string
var Account string
var Pwd string
var Balance int
fmt.Scanf("%sn", &caozuo)
if caozuo == "存款" {
fmt.Scanf("%s%s%d", &Account, &Pwd, &Balance)
user1.chuekuan(Account, Pwd, Balance)
}
if caozuo == "取款" {
fmt.Scanf("%s%s%d", &Account, &Pwd, &Balance)
user1.qukuan(Account, Pwd, Balance)
}
}
二.接口
go语言中接口中只设定函数,不能设定具体的方法,同时对于一个结构体来说,必须设定好接口中声明的所有函数,不然会报错。
具体样例
package main
import "fmt"
type usb interface {
Start()
Print()
End()
}
type Student struct {
Name string
Score float64
Number string
}
type Computer struct {
}
func (c Computer) Working(usb1 usb) {
usb1.Start()
usb1.Print()
usb1.End()
}
func (s Student) Start() {
fmt.Println("开始工作")
}
func (s Student) Print() {
fmt.Println("学生的信息", s.Name, s.Score, s.Number)
}
func (s Student) End() {
fmt.Println("结束工作")
}
func main() {
Student1 := Student{"小张", 87, "202"}
var b usb = Student1
computer := Computer{}
computer.Working(Student1)
b.Print()
}
结果:
开始工作
学生的信息 小张 87 202
结束工作
学生的信息 小张 87 202
三.断言
正常情况下下面的代码将会报错
package main
import "fmt"
type Point struct {
x int
y int
}
func main() {
var a interface{}
var b Point = Point{2, 3}
a = b
fmt.Println(a)
var c Point
c = a
fmt.Println(c)
}
结果:
# command-line-arguments
.hello.go:16:4: cannot use a (type interface {}) as type Point in assignment: need type assertion
如果使用类型断言
package main
import "fmt"
type Point struct {
x int
y int
}
func main() {
var a interface{}
var b Point = Point{2, 3}
a = b
fmt.Println(a)
var c Point
c = a.(Point)//这里使用了类型断言,如果可以转换为Point类型就转换,不可以就报错
fmt.Println(c)
}
结果:
{2 3}
{2 3}
正常情况下,上面这种断言会出错,所以可以使用带检查的类型断言
func main() {
var a interface{}
var b Point = Point{2, 3}
a = b
fmt.Println(a)
c, ok := a.(Point)//这里如果可以转化则ok为true,否则为false,不会使得程序中断
if ok {
fmt.Println(c)
} else {
fmt.Println("转化出错")
}
}



