博客
关于我
golang 第四课 结构体(struct)、interface{}、方法(func)详解
阅读量:583 次
发布时间:2019-03-11

本文共 2049 字,大约阅读时间需要 6 分钟。

视频教程地址:

方法(func)

在 Go 语言中,方法的定义与其他语言相似,但有一个独特的功能:它可以接受零个或多个参数。

  • 无参数,无返回值
    def func fn() {
    // 方法的格式
    // func funcName(arg type ...) ([arg] type ...) { // 返回值只有一个可以省略括号
    // }}
  • 有参数,有返回值
    def func fn1(arg1 int, arg2 int) (a int) {
    a := arg1 + arg2
    return
    }
  • 零个或多个参数
    def func fn2(args ...int) {
    fmt.Printf("%T, %v\n", args, args)
    a := 0
    for _, k := range args {
    a += k
    }
    fmt.Println("a val:", a)
    }

接口(interface)

接口在 Go 语言中用来定义方法,类似于其他编程语言,但有个特殊之处:只要某个类型实现了接口中的方法,就被认为实现了该接口,无需显式继承。

  • 定义接口
    type It1 interface {
    Add(int) int
    Sub(int) int
    }
  • 实现接口的型式
    type Num int
    func (num Num) Add(n int) int {
    a := int(num)
    a += n
    num = Num(a)
    return a
    }
    func (num Num) Sub(n int) int {
    a := int(num)
    a -= n
    num = Num(a)
    return a
    }
  • 接口的应用
    func Ad(num It1, n int) int {
    return num.Add(n)
    }
    func main() {
    a := 10
    num := Num(a)
    b := Ad(num, 10)
    fmt.Println("b:", b)
    fmt.Println("a:", a)
    fmt.Println("num:", num)
    }

问题演变:使值变化

将上述代码中的部分逻辑进行调整,确保值得改变:

  • 修改后的定义
    type It1 interface {
    Add(int) int
    Sub(int) int
    }
    type Num int
    func (num *Num) Add(n int) int {
    a := int(*num)
    a += n
    *num = Num(a)
    fmt.Println("ADD:", *num)
    return a
    }
    func (num *Num) Sub(n int) int {
    a := int(*num)
    a -= n
    *num = Num(a)
    return a
    }
  • 执行示例
    func main() {
    a := 10
    num := Num(a)
    fmt.Println("M ADDR : ", &num)
    b := Ad(&num, 10)
    fmt.Println("b:", b)
    fmt.Println("a:", a)
    fmt.Println("num:", num)
    }

结构体(struct)

在 Go 语言中,结构体用于定义自定义数据结构。

  • 结构体定义
    type Person struct {
    Name string
    Age uint8
    Money int
    }
  • 方法定义
    func (person *Person) GetName() string {
    return person.Name
    }
    func (person *Person) AddIncome(money int) int {
    person.Money += money
    return person.Money
    }
  • 结构体实例化
    func Str() {
    student1 := Person{
    Name: "zzh",
    Age: 18
    }
    fmt.Printf("stu1:%+v\n", student1)
    var student2 Person
    student2.Name = "zzh2"
    student2.Age = 19
    fmt.Printf("stu2:%+v\n", student2)
    AddUserMoney(&student1, 10)
    AddUserMoney(&student2, 20)
    fmt.Printf("stu1:%+v\n", student1)
    fmt.Printf("stu2:%+v\n", student2)
    }
  • 接口实现
    type Human interface {
    GetName() string
    AddIncome(int) int
    }
    func AddUserMoney(user Human, money int) int {
    return user.AddIncome(money)
    }

转载地址:http://ixatz.baihongyu.com/

你可能感兴趣的文章
MySQL学习之《查询数据》
查看>>
java设计模式--代理模式
查看>>
如何提高SQL查询的效率?
查看>>
Docker容器安装软件报E: Unable to locate package的错误
查看>>
Docker入门之-镜像(二)
查看>>
设置canvas图作为背景图?亲测有效
查看>>
搭建Docker本地 Registry
查看>>
数据结构——链表(3)
查看>>
32位机器与64位机器在编程方面的差别
查看>>
socket模块和粘包现象
查看>>