博客
关于我
golang 第四课 结构体(struct)、interface{}、方法(func)详解
阅读量:585 次
发布时间: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/

你可能感兴趣的文章
【二叉树】已知后序与中序求先序
查看>>
解决Nginx 404 not found问题
查看>>
计算机网络之第三章笔记--数据链路层
查看>>
创建型模式之简单工厂模式实例及代码操作
查看>>
广东外语外贸大学第三届网络安全大赛Writeup
查看>>
VS2019 报错: LINK Error 无法找到 MSCOREE.lib的解决办法
查看>>
2021-04-23
查看>>
hadoop 分布式文件系统的计算和高可用
查看>>
【Linux】VMware Workstation 不可恢复错误: (vcpu-0)
查看>>
VS中 fatal error LNK1123: 转换到 COFF 期间失败 的解决方法
查看>>
ant design pro v5去掉右边content区域的水印
查看>>
JavaScript——使用iterator遍历迭代map,set集合元素
查看>>
IAR调试卡顿的解决办法
查看>>
Course Schedule II
查看>>
Django ORM操作
查看>>
京喜小程序体验评分优化实践
查看>>
C#中文转换成拼音
查看>>
C++错误笔记
查看>>
【无线通信模块】GPRS DTU不稳定和容易掉线原因
查看>>
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
查看>>