当前位置: 首页 > news >正文

Go 方法

第 1 章  方法

Go 语言也支持面向对象的思想;
所谓面向对象编程:
1对象就是简单的一个值或者变量,并且拥有其方法
2方法是某种特定类型的函数
3

面向对象编程就是使用方法来描述每个数据结构的属性和操作;

使用者不需要了解对象本身的实现

   

1.1 方法声明

方法声明
方法声明概述

方法的声明和普通函数的声明类似,只是在函数名字前面多了一个(类型)参数 ;

这个参数把这个方法绑定到对应的类型上

代码示例

gop1.io/ch6/geometry

package geometry

import "math"

type Point struct{ X ,Y float64 }

// 普通的函数定义

func Distance(p,q Point) float64 {

        return math.Hypot(q.X - p.X ,q.Y - p.Y)

}

// Point 类型的方法

func (p Point) Distance(q Point) float64 {

        return math.Hypot(q.X - p.X ,q.Y - p.Y)

}

关于接收者附加的参数 p 称为方法的接收者,用来描述主调方法向对象发送消息

Go 语言中,接收者不使用特殊名(比如 this 或 self);

我们自己选择接收者名字,就像其他的参数变量名一样

接收者会频繁地使用,因此最好能够选择简短且在整个方法中名称始终保持一致的名字;

最常用的办法是取类型名称的首字母(小写),就像 Point 中的 p

方法调用

调用方法的时候,接收者在方法名的前面;

这样,调用就和声明保持顺序一致了

p  :=  Point{1,2}

q  :=  Point{3,4}

fmt.Println(Distance(p,q))    // 函数调用

fmt.Println(p.Distance(q))       // 方法调用

上面两个 Distance 函数声明没有冲突
第一个声明了一个包级别的函数(geometry.Distance)
第二个声明了一个类型 Point 的方法,其名字为 Point.Distance
表达式 p.Distance 称为选择子(selector),因为 p.Distance 为接收者 p 选择合适的 Distance 方法
选择子语法也用于选择结构类型中的某些字段值,就像 p.X 中的字段值

由于方法和字段来自于同一个命名空间(在同一个结构类型中),因此在 Point 结构类型中声明一个叫 X 的方法会与字段 X 冲突,编译器会报错

小结 :同类型中,不能存在同名的标识符

因为每一个类型有其自己的命名空间,所以我们能够在其他不同的类型中使用名字 Distance 作为方法名

定义一个 Path 类型表示一条线段,同样也使用 Distance 作为方法名

// Path 是连接多个点的直线段

type Path [ ]Point

// Distance 方法返回路径的长度

func (path Path) Distance() float64 {

        sum  :=  0.0

        for  i  :=  range  path  {

                if i  >  0 {

                        sum  +=  path[i-1].Distance(path[i])

                }

        }

        return  sum

}

path 是一个命名的 slice 类型,而非 Point 这样的结构体类型,但我们依旧可以给它定义方法

Go 和许多其他面向对象的语言不同;

在 Go 语言中,可以将方法绑定到任何类型上

我们可以很方便地为简单的类型(如数字 、字符串 、slice 、map ,甚至函数等)定义附加的行为(方法)
同一个包下的任何类型都可以声明方法,只要它的类型既不是指针类型也不是接口类型

这两个 Distance 方法(Point.Distance 和 Path.Distance)拥有不同的类型;

它们彼此无关,尽管 Path.Distance 在内部使用 Point.Distance 来计算线段相邻点之间的距离

总结:

在同一个结构类型中,

字段与字段不能同名

方法与方法不能同名

字段与方法不能同名

但在两个不同的结构类型中,可以存在相同名称的字段或方法,前提是相同的字段或方法,所属的类型不同

1.2 指针接收者的方法

1.3 通过结构体内嵌来组成(新)类型

1.4 方法变量与表达式

1.5 示例:位向量

1.6 封装

相关文章:

Go 方法

第 1 章 方法 Go 语言也支持面向对象的思想;所谓面向对象编程:1对象就是简单的一个值或者变量,并且拥有其方法2方法是某种特定类型的函数3 面向对象编程就是使用方法来描述每个数据结构的属性和操作; 使用者不需要了解对象本身的…...

深度学习与大数据在自然语言处理中的应用与进展

引言 在当今社会,深度学习和大数据技术的快速发展为自然语言处理(NLP)领域带来了显著的进步。这种技术能够使计算机更好地理解和生成人类语言,从而推动了搜索引擎、语音助手、机器翻译等领域的创新和改进。 NLP的发展与技术进步…...

GPT4+Python近红外光谱数据分析及机器学习与深度学习建模

详情点击链接:GPT4Python近红外光谱数据分析及机器学习与深度学习建模 第一:GPT4 1、ChatGPT(GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变) 2、ChatGPT对话初体验 3、GPT-4与GPT-3.5的区别,以及与国内大语言模…...

Java项目:12 Springboot的垃圾回收管理系统

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 1.介绍 垃圾分类查询管理系统,对不懂的垃圾进行查询进行分类并可以预约上门回收垃圾。 让用户自己分类垃圾, 按国家标准自己分类…...

HarmonyOS自定义弹出对话框CustomDialog并传递变量

HarmonyOS定义了一系列弹窗反馈类的组件​ 和前端开发框架VUE3配套生态库element plus中的提供各种组件相比,还是要少一些。可能是手机端操作和PC端操作的差异导致的​ 如果内置的弹窗不满足要求,可以基于CustomDialog自定义出各种个性化的反馈组件。 首先新建一个ets文件,…...

React16源码: React中的renderRoot的错误处理的源码实现

renderRoot的错误处理 1 )概述 在 completeWork这个方法之后, 再次回到 renderRoot 里面在 renderRoot 里面执行了 workLoop, 之后,对 workLoop 使用了try catch如果在里面有任何一个节点在更新的过程当中 throw Error 都会被catch到catch到之后就是错误…...

强化学习:MuJoCo机器人强化学习仿真入门(1)

声明:我们跳过mujoco环境的搭建,搭建环境不难,可自行百度 下面开始进入正题(需要有一定的python基础与xml基础): 下面进入到建立机器人模型的部分: 需要先介绍URDF模型文件和导出MJCF格式 介绍完…...

8.Gateway服务网关

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…...

JVM篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、虚拟机栈(线程私有)二、本地方法区(线程私有)三、你能保证 GC 执行吗?四、怎么获取 Java 程序使用的内存?堆使用的百分比?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…...

WPF引用halcon的HSmartWindowControlWPF控件一加上Name属性就,无缘无故运行后报错

报错内容: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MC1000 未知的生成错误“Could not find assembly System.Drawing.Common, Version0.0.0.0, Cultureneutral, PublicKeyTokencc7b13ffcd2ddd51. Either explicitly load this assembly using a method …...

Vue3组件库开发 之Button(2) 未完待续

Vue3组件库开发 之Button(1) 中新建项目,但未安装成功ESLINT 安装ESLINT npm install eslint vite-plugin-eslint --save-dev 安装eslint后,组件文件出现错误提示 添加第三方macros ,虽然不是官网但很多开发者都是vue3开发人员 安装macros…...

k8s节点RouteCreated为false

出现该情况后,一般是初始化节点失败。因此,需要把节点从集群中移除,再加入到集群中,即可解决。 通常出现这个状况后,该节点上是没有被分配pod ip的,可以通过命令查看: # 发现没有PodCIDR、PodC…...

Kafka(二)原理详解

一 、kafka核心总控制器(Controller) 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。 作用:leader副…...

Flutter 屏幕适配之相对尺寸适配

在Android中我们可以通过脚本来动态生成适配于各个厂商的屏幕的相对尺寸。 那么在Flutter中我们如何通过相同的思路来实现同样的效果呢?我们知道,Android的每个厂商的屏幕大小存在非常大区别。有些长,有的短,有的粗,有…...

在线预约小程序源码系统:适合任何行业的在线预约,快捷方便,省时省心 带完整的搭建教程

互联网技术的发展,人们对便捷服务的需求越来越高。特别是在线预约服务,无论是在医疗、美容、餐饮还是其他行业中,用户都希望能够通过简单的方式预约到所需的服务。然而,传统的预约方式往往效率低下,不能满足用户的快速…...

AI部署开发指南:用vs2019编译OnnxRuntime-v1.16.2

前言 要详细了解一个系统的部署,对其源码进行调试可能是最好的办法。 Pytorch的部署几经改版,最大的特点依然是不稳定,或者使用libtorch这种稳定但优化力度不够的部署方案。 而稳定且通用的方案,目前仍然是export to onnx的办法…...

【强化学习】QAC、A2C、A3C学习笔记

强化学习算法:QAC vs A2C vs A3C 引言 经典的REINFORCE算法为我们提供了一种直接优化策略的方式,它通过梯度上升方法来寻找最优策略。然而,REINFORCE算法也有其局限性,采样效率低、高方差、收敛性差、难以处理高维离散空间。 为…...

android usb2.0 协议基础(2)

2.4 USB逻辑部件 USB 逻辑部件 设备---》 接口 (一个或多个):用于描述特定功能,包含多个端点----》端点(一个或多个): 传输的最终对象端点号,传输类型传输方向,最大的数据…...

C语言快速排序(非递归)图文详解

前言: 上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈…...

Java面试题136-150

36、用JDBC如何调用存储过程 代码如下: package com.huawei.interview.lym; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class JdbcTest…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...