yyz notes yyz notes
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

益章

可乐鸡翅
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • golang基础

    • 初识golang

    • golang基础语法

    • golang流程控制

    • golang函数

    • golang内置函数

    • golang包

    • golang错误异常处理

    • golang面向对象(结构体)

      • 结构体基础
      • 结构体中的字段
      • 结构体中的方法
        • 介绍
          • 注意
        • 自定义属性绑定方法
        • 方法和函数的区别
          • 绑定指定类型
          • 调用方式不一样
          • 对于函数来说,参数类型对应是什么就要传入什么。
          • 对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。
      • 方法的注意事项
      • 封装
      • 继承
      • 接口 interface
      • 多态
      • 断言
    • golang文件处理

    • golang并发编程简介

    • golang并发编程-协程

    • golang网络编程

    • 反射 reflect

  • golang高级

  • 常用组件

  • gin

  • golang
  • golang基础
  • golang面向对象(结构体)
YiZhang-You
2023-05-24
目录

结构体中的方法

# 3. 结构体中的方法

# 介绍

方法是作用在指定的数据类型上、和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct

方法的声明和调用格式:

package main

import "fmt"

type Cat struct {
	name string
	age  int
}

// 声明方法: 给结构体Cat绑定__str方法
// 重写类似于python在__str方法
func (p Cat) __str() { //实际p就是python中类函数的self
	fmt.Println(p.name, p.age) //方法中可以访问结构体的属性
}

func main() {
	var p1 Cat
	p1.name = "小猫咪"
	p1.age = 88
	// 调用方法
	p1.__str()
}

/*
	小猫咪 88
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  • func (p Cat) str()相当于Cat结构体有一个方法叫str

  • (p Cat)体现方法__str和结构体Cat绑定关系

# 注意

  • test方法中参数名字随意起

  • 结构体Person和test方法绑定,调用test方法必须靠指定的类型:Person

  • 如果其他类型变量调用test方法一定会报错。

  • 结构体对象传入test方法中,值传递,和函数参数传递一致。

  • 方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。

# 自定义属性绑定方法

Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct,比如int , float32等都可以有方法

package main

import "fmt"

type integer int

func (i integer) print() {
	i = 30
	fmt.Println("i = ", i)
}
func (i *integer) change() {
	*i = 30
	fmt.Println("i = ", *i)
}
func main() {
	var i integer = 20
	i.print()
	i.change()
	fmt.Println(i)
}

/*
	i =  30
	i =  30
	30
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 方法和函数的区别

# 绑定指定类型

方法:需要绑定指定数据类型(比如python中的self,需要添加了才知道你是属于那个类的) 函数:不需要绑定数据类型

# 调用方式不一样

  • 函数的调用方式:
函数名(实参列表)
1
  • 方法的调用方式:
变量.方法名(实参列表)
1
package main

import "fmt"

type Student3 struct {
	Name string
}

// 定义方法:
func (s Student3) test01() {
	fmt.Println(s.Name)
}

// 定义函数:
func method01(s Student3) {
	fmt.Println(s.Name)
}
func main() {
	//调用函数:
	var s Student3 = Student3{Name: "丽丽"}
	method01(s)
	//方法调用:
	s.test01()
}

/*
	丽丽
	丽丽
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 对于函数来说,参数类型对应是什么就要传入什么。

package main
import "fmt"
type Student struct{
        Name string
}
//定义函数:
func method01(s Student){
        fmt.Println(s.Name)
}
func method02(s *Student){
        fmt.Println((*s).Name)
}
func main(){
        var s Student = Student{"丽丽"}
        method01(s)
        //method01(&s)错误
        method02(&s)
        //method02(s)错误
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。

package main
import "fmt"
type Student struct{
        Name string
}
//定义方法:
func (s Student) test01(){
        fmt.Println(s.Name)
}
func (s *Student) test02(){
        fmt.Println((*s).Name)
}
func main(){
        var s Student = Student{"丽丽"}
        s.test01()
        (&s).test01()//虽然用指针类型调用,但是传递还是按照值传递的形式
        (&s).test02()
        s.test02()//等价
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
编辑 (opens new window)
结构体中的字段
方法的注意事项

← 结构体中的字段 方法的注意事项→

最近更新
01
配置yun源
05-24
02
linux-配置python虚拟环境
05-24
03
linux文件目录管理
05-24
更多文章>
Theme by Vdoing | Copyright © 2023-2023 yizhang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式