golang 基础知识细节回顾

news2024/11/23 21:49:19

之前学习golang的速度过于快,部分内容有点囫囵吞枣的感觉,写gorm过程中有很多违反我常识的地方,我通过复习去修正了我之前认知错误和遗漏的地方。


itoa

itoa自增的作用在编辑error code时候作用很大,之前编辑springboot的error code字符时需要额外编辑code码,现在用了itoa是真香了


约定

golang语言的作者很喜欢约定俗成的东西,可能他认为很多东西没必要重复声明

  • public,protect,private 函数 通过首字母是否大写实现能否调用的效果,内部方法在名前加_
  • interval 为内部包,当设为内部包的时候,其他包无法调用
  • interface只能在包内调用,其他包实现后无法通过interface去new结构体
  • 测试用例以_test.go作为末尾进行实现

当然gorm也有很多约定,等进入gorm时提前总结一下


匿名函数

匿名函数作为一个函数或方法内部执行的函数,多了两个额外参数,代表立即执行,例如:

func main() {
	a, b := 1, 2
	func(a int, b int) {
		fmt.Println(a + b)
	}(a, b)
}

此时额外参数接收外部变量立即执行方法


循环控制

当管道执行中出现异常时,for select跳出只能跳到for循环,不能跳到for以外。又例如双for 循环,需要一次性跳出去时,java需要添加一个flag或者直接return,这里通过Loop + break进行限制

func main() {
	n := 10
	m := 10
Loop:
	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			println(i, j)
			if i == 5 && j == 5 {
				break Loop
			}
		}
	}
}

以上方法可以快速跳出循环


结构体

结构体实际作为类进行使用,当我们定义一个结构体时,我们可以通过指定函数对应的接收对象将其认定为指定结构体的方法。

结构体作为接收者,可以通过值引用或者类型引用进行传递,当作为值引用的时候,不会修改原来副本的值,而作为指针传递的时候,会修改原来的副本的值

type Dogs struct {
	numbers int
}

func (d Dogs) Add() {
	d.numbers++
}

func (d *Dogs) RealAdd() {
	d.numbers++
}

func main() {
	dogs := new(Dogs)
	fmt.Println(dogs.numbers)
	dogs.Add()
	fmt.Println(dogs.numbers)
	dogs.RealAdd()
	fmt.Println(dogs.numbers)
}
//0
//0
//1

接口

面向对象两个关键的操作在于继承父类和实现接口,现在默认接口作为你的父类,所以通过指定参数名为接口名,传递值或指针为实现接口的结构体,就可以实现指定类型的输入。并且可以直接输入原始的interface{}用于接收所有的类型值。

type Animal interface {
	Walk()
	Bark()
}

type Dog struct {
	name string
	age  int
}

func (d *Dog) Walk() {
	fmt.Printf("%s is Walking...\n", d.name)
}
func (d *Dog) Bark() {
	fmt.Printf("wang wang wang\n")
}

type Cat struct {
	name string
	age  int
}

func (c Cat) Walk() {
	fmt.Printf("%s is Walking...\n", c.name)
}
func (c Cat) Bark() {
	fmt.Printf("miao miao miao\n")
}

func show(animal Animal) {
	animal.Walk()
	animal.Bark()
}

func main() {
	cat := Cat{"cat", 1}
	dog := Dog{"dog", 2}

	show(cat)
	show(&dog)
}

cat的方法接收者是变量,此时cat的方法属于结构体,因此show传入cat

dog的方法接收者是指针,此时dog的方法属于对象,因此show传入dog的地址


指针

指针一直是我有所不理解的内容,其实从上大一开始就说的很不明确,指针到底是指带星号的值是指针还是地址是指针,为什么要传递指针,为什么传递指针后不用修改值了,后来导致我直接放弃学c去学java,毕竟java当时还比较火,后面深度学习时用的python也没有指针。

其实我一直是冤枉指针了,其实也不能说是冤枉,可能是因为没有一个好的老师给我指明确到底指针是什么玩意,类似的什么依赖注入,控制反转,可持久化,我听得晕头转向的就很容易迷糊。

闲话少说了,其实指针就是变量内存地址,通过指针,我们可以定位这个值在内存的位置。指针有两种获取方法,当你声明的是一个 intPtr *int的变量时,那么你获取的就是一个指针,当你打印intPtr时就是指针值,当你打印*intPtr时就是值。当你声明num:=0时,&num就是指针。

func main() {
	num := 0
	var intPtr *int
	intPtr = new(int)
	fmt.Println(&num)
	fmt.Println(intPtr)
}
//0x949a058
//0x949a05c

其实传递参数的时候如果传递&num,其实也是传值,但是传递的是内存地址的值,接收的时候参数写为 *num即可获取指针的值,此时两边默认修改的都是内存中的值了,也不需要return了

func setCount(ptr *int) {
	num := *ptr
	num += 1
}

func main() {
	num := 10
	setCount(&num)
	fmt.Println(num)
}

golang指针语法糖

type product struct {
	num int
}

func add(p *product) {
	p.num += 1
	fmt.Println(p)
	fmt.Println(p.num)
}

func main() {
	add(&product{0})
}

当你传递的参数为一个结构体是,如果你想处理结构体中的变量,那么golang会自动解引用,什么意思呢,你传递的为product的地址,即为&product,此时方法接收到也为&product,打印也为&product,但是你修改值的时候,它自动解引用了,即p.num其实是(*p).num,这里要注意


依赖注入

wire框架可以做的很好,但是我现在没怎么看,还得练

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux学习】(2)OS的简单了解|Linux的基本指令操作

前言 本文将先简单了解什么是操作系统&#xff0c;再讲解一些Linux的基本指令。 一、操作系统的简单了解 1、什么是操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;&#xff1f; OS是一款做软硬件管理的软件。软硬件的体系结构图&#xff1a; 硬件&…

探索高级聚类技术:使用LLM进行客户细分

在数据科学领域&#xff0c;客户细分是理解和分析客户群体的重要步骤。最近&#xff0c;我发现了一个名为“Clustering with LLM”的GitHub仓库&#xff0c;它由Damian Gil Gonzalez创建&#xff0c;专门针对这一领域提供了一些先进的聚类技术。在这篇文章中&#xff0c;我将概…

「 网络安全常用术语解读 」SBOM主流格式SWID详解

国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&#xff08;International Electrotechnical Commission&#xff0c;IEC&#xff09;发布了ISO/IEC 19770-2软件标识&#xff08;Software Identification&#xff0c;SWID&#xff09;标签标准&#xff0c;该标准定…

Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍

往期回顾 Qt绘图与图形视图之Graphics View坐标系的简单介绍-CSDN博客 Qt绘图与图形视图之基本图元绘制的简单介绍-CSDN博客 Qt绘图与图形视图之自定义图元实现拖拽、拉伸、旋转功能-CSDN博客 Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍 一、基本概念 Qt模型视图代理…

前端页面平滑过渡解决方案

一、问题产生 在使用图片作为页面背景时&#xff0c;无法使用transtion进行平滑过渡&#xff0c;直接切换背景又会降低使用体验。 二、解决方式 使用clip-path对背景图片裁剪配合transtion实现平滑过渡的效果 三、效果展示 网址&#xff1a;ljynet.com 四、实现方式 tem…

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习 1、 for i in range(3):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()3、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()4、 for…

32.Docker认识

Docker介绍 Docker是一个快速交付应用&#xff0c;运行应用的技术。 1.可以将程序、依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统。 2.运行时利用沙箱机制行程隔离容器&#xff0c;各个应用互不干扰。 3.启动、移除都可以通过一行命令完成&am…

算法学习系列(五十五):背包模型(三)

目录 引言一、潜水员二、背包问题求具体方案三、机器分配四、开心的今明五、金明的预算方案 引言 今天介绍的是背包模型&#xff0c;还是以题目的形式来介绍的。主要讲了背包问题求方案&#xff0c;就是由最优方案递推回去即可。还有就是一些比较经典的背包问题&#xff0c;其…

Spring Boot | Spring Security ( SpringBoot安全管理 )、Spring Security中 的 “自定义用户认证“

目录 : Spring Boot 安全管理 &#xff1a;一、Spring Security 介绍二、Spring Security 快速入门2.1 基础环境搭建 :① 创建Spring Boot 项目② 创建 html资源文件③ 编写Web控制层 2.2 开启安全管理效果测试 :④ 添加 spring-boot-starter-security 启动器⑤ 项目启动测试 三…

Windows server2016关闭ie增强

要关闭Windows Server 2016上的IE增强安全配置&#xff0c;请按照以下步骤操作&#xff1a; 打开“服务器管理器”。点击“本地服务器”。在服务器管理器中&#xff0c;找到“IE增强的安全配置”&#xff0c;点击旁边的“启用”&#xff0c;打开“Internet Explorer增强的安全配…

android init进程启动流程

Android系统完整的启动流程 android 系统架构图 init进程的启动流程 init进程启动服务的顺序 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// immediately takes it out of the restarting state if it was in there.flags_…

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(70)

1. 题目解析 题目链接&#xff1a;740. 删除并获得点数 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 问题分析 本题是「打家劫舍」问题的变种&#xff0c;但核心逻辑依然保持一致。题目要求从给定的数组nums中选择…

【 书生·浦语大模型实战营】作业(七):大模型实战评测

【 书生浦语大模型实战营】作业&#xff08;七&#xff09;&#xff1a;大模型实战评测 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学…

「2024年」前端开发常用工具函数总结 TypeScript

前言 在前端开发中&#xff0c;工具函数是提高代码复用率、保持代码整洁和增加开发效率的关键。使用 TypeScript 编写工具函数不仅可以帮助开发者捕捉到更多的类型错误&#xff0c;还可以提供更清晰的代码注释和更智能的代码补全。下面是一些在 TypeScript 中常用的前端开发工…

【iOS】方法交换(Method Swizzling)

文章目录 前言一、原理与注意用法注意要点Method Swizzing涉及的相关API 二、应用场景与实践1.统计VC加载次数并打印2.防止UI控件短时间多次激活事件3.防崩溃处理&#xff1a;数组越界问题4.防KVO崩溃 总结 前言 上文讲到了iOS的消息发送机制&#xff0c;在消息机制中我们了解…

【打工日常】云原生之使用docker部署Web在线流程图软件

一、drawio介绍 1.drawio简介 draw.io是一款免费、开源、高质量的WEB在线流程图软件&#xff0c;无需注册登录&#xff0c;支持多种图表类型和元素&#xff0c;可在线编辑和导出。它是一个可配置的图表/白板可视化应用程序。该应用程序的设计主要是按原样使用。draw.io不适合作…

AI诗歌创作

诗歌作为一种文学形式&#xff0c;能够通过优美的语言和深刻的意境表达情感和思想&#xff0c;触动人心&#xff0c;引发共鸣。然而&#xff0c;如今随着生活节奏的加快和人们对实用性的追求&#xff0c;写诗这一传统艺术渐渐被人们所忽略。幸运的是&#xff0c;随着人工智能技…

【C++】双指针算法:四数之和

1.题目 2.算法思路 这道题目十分困难&#xff0c;在leetcode上的通过率只有36%&#xff0c;大家要做好心理准备。 在做个题目前强烈建议大家先看看我的上一篇博客&#xff1a;有效三角形个数&#xff0c;看完之后再去leetcode上写一写三数之和&#xff0c;搞懂那两个题目之后…

基于STM32的最小系统电路设计(STM32F103C8T6为例)

前言&#xff1a;本篇博客为嵌入式硬件领域的文章&#xff0c;对 STM32 的最小系统电路设计进行教学。本篇博客以嘉立创 EDA&#xff08;标准版&#xff09;进行绘制 STM32F103C8T6 的最小系统电路 PCB 板&#xff0c;STM32 的最小系统通常包括&#xff1a;微控制器、时钟电路、…

[Power Automate] 关联Teams,发起通知并进行审批

1、 workflow 创建一条teams chat,定义teams members 和 chat title 2、添加通知内容到刚刚创建的chat 里 3、发起teams 审批流程&#xff08;通过这个action&#xff0c;进行teams内部的审批&#xff09; 4、审批结果判断&#xff0c;在这个基础上进行审批之后的操作&#xff…