golang 基础知识细节回顾

之前学习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, 2func(a int, b int) {fmt.Println(a + b)}(a, b)
}

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


循环控制

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

func main() {n := 10m := 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 stringage  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 stringage  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 := 0var intPtr *intintPtr = new(int)fmt.Println(&num)fmt.Println(intPtr)
}
//0x949a058
//0x949a05c

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

func setCount(ptr *int) {num := *ptrnum += 1
}func main() {num := 10setCount(&num)fmt.Println(num)
}

golang指针语法糖

type product struct {num int
}func add(p *product) {p.num += 1fmt.Println(p)fmt.Println(p.num)
}func main() {add(&product{0})
}

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


依赖注入

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA基础之反射】反射详解

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 1.反射 1.1 概述 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它…

代码随想录算法训练营DAY43|C++动态规划Part5|1049.最后一块石头的重量II、494.目标和、474.一和零

文章目录 1049.最后一块石头的重量II思路CPP代码 494.目标和回溯算法抽象成01背包问题CPP代码本题总结 474.一和零思路CPP代码 1049.最后一块石头的重量II 力扣题目链接 文章链接&#xff1a;1049.最后一块石头的重量II 视频链接&#xff1a;这个背包最多能装多少&#xff1f;L…

成都旅游攻略

第一天 大熊猫基地(55一人) 切记要去早&#xff0c;否则只能看到熊猫屁股 文殊院(拜文殊菩萨) 杜甫草堂(50一人) 宽窄巷子(旅游打卡拍照) 奎星楼街吃晚饭 这里的饭菜很可口 第二天 东郊记忆(成都故事.川剧变脸)主要是拍照打卡 春熙路 IFS国金中心(打卡熊猫屁屁) 太…

Spring Boot中使用Redis和Lua脚本实现延时队列

码到三十五 &#xff1a; 个人主页 延时队列是一种常见的需求。延时队列允许我们延迟处理某些任务&#xff0c;这在处理需要等待一段时间后才能执行的操作时特别有用&#xff0c;如发送提醒、定时任务等。文中&#xff0c;将介绍如何在Spring Boot环境下使用Redis和Lua脚本来实…

【C++STL详解(五)】--------list的介绍与使用

目录 前言 一、list的介绍 二、list的使用 Ⅰ.默认成员函数 1、构造函数 2、赋值重载 3、析构函数 Ⅱ、容量 1.size() Ⅲ、迭代器与遍历 1.beginend (正向迭代器) 2.rbeginrend (反向迭代器) 3.front 4.back Ⅳ、增删查改 1.push_front 2.pop_front 3.push_b…

vue3 + ts 快速入门(全)

文章目录 学习链接1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue …

CUDA共享内存

GPU中有两种类型的内存&#xff1a; 板载内存片上内存 全局内存是较大的板载内存&#xff0c;延迟相对较高&#xff1b;共享内存是较小的片上内存&#xff0c;具有相对较低的延迟。共享内存的常用用途&#xff1a; 块内线程的通信通道全局内存数据的可编程管理缓存高速暂存存…

设备能源数据采集新篇章

在当今这个信息化、智能化的时代&#xff0c;设备能源数据的采集已经成为企业高效运营、绿色发展的重要基石。而今天&#xff0c;我们要向大家介绍的就是一款颠覆传统、引领未来的设备能源数据采集神器——HiWoo Box网关&#xff01; 一、HiWoo Box网关&#xff1a;一站式解决…

confluence 设置https代理

使用nginx反待confluence并开启https后&#xff0c;登录confluence会一直提示&#xff1a;scheme、proxyName、proxyPort设置错误。 解决办法&#xff1a; find / -name server.xmlvi /opt/atlassian/confluence/conf/server.xml HTTP反代配置 HTTPS反代配置

jvm垃圾回收机制介绍

JVM&#xff08;Java虚拟机&#xff09;是Java程序的运行环境&#xff0c;它负责执行字节码文件。JVM的工作原理主要包括以下几个部分&#xff1a;类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码&#xff0c;执行引擎负…

SQL数据库

一.什么是数据库 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储。&#xff08;database 简称DB&#xff09; 数据库管理系统&#xff1a;管理数据库的大型软禁&#xff08;DataBase Management System 简称DBMS&#xff09; SQL&#xff1a;操作关系…

微信开发api、微信视频号开发

接口地址&#xff1a; http://api.videostui.com/finder/v2/api/login/checkLogin 接口说明 获取到登录二维码后需每间隔5s调用本接口来判断是否登录成功新设备登录平台&#xff0c;次日凌晨会掉线一次&#xff0c;重新登录时需调用获取二维码且传appId取码&#xff0c;登录成…

莫比乌斯变换的数学原理

关键词&#xff1a;Mobius Transformations 一、说明 关于莫比乌斯变换&#xff0c;是一个代数几何变换的重要概念。也是双曲几何的重要理论&#xff0c;比如庞加莱盘就是建立在这个理论上&#xff0c;那么这个变换到底有哪些内容&#xff1f;本文将做出详细的解读。 二、线…

使用量排名前50的GPTs趋势和特征

Chatgpt的gpt商店已经有几千gpts了。目前哪些gpts比较受欢迎呢&#xff1f;有哪些趋势和投资呢? 根据whatplugin.ai&#xff08;截止日期为2024年3月&#xff09;&#xff0c;使用量最多的50个gpts数据分析结果如下&#xff1a; GPTs类型的分布情况如下&#xff1a; 图像生成…

FreeRTOS任务通知

FreeRTOS任务通知 FreeRTOS 新增了任务通知(Task Notifictions)这个功能&#xff0c;可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高&#xff0c;任务通知在 FreeRTOS 中是一个可选的功能&#xff0c; 使用队列、信号量、事件标志…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;不仅改变了人们之间的社交方式&#xff0c;也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点&#xff0c;以及它如何塑造和改变…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

2-手工sql注入(进阶篇) sqlilabs靶场1-4题

1. 阅读&#xff0c;学习本章前&#xff0c;可以先去看看基础篇&#xff1a;1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战&#xff0c;关于sqlilabs靶场的搭建&#xff1a;Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap&#xff0c;关于sqlmap的命令&…

stm32f103zet6_串口实现-DHT11-tim1(定时)

1思路 1打开时钟 1.1使用定时器实现us级的计时 1.2在打开串口 1,3在DHT11驱动中修改引脚 stm32cudeMX 配置 1打开时钟 2打开串口 3打开tim1(定时器) 4生成代码 代码设置 1导入DHT11库(tim.h是定时器的文件系统自动生成的) DHT11.c #include "dht11.h" #inc…

PHP算命源码_最新测算塔罗源码_可以运营

功能介绍 八字精批、事业财运、姓名分析、宝宝起名、公司测名、姓名配对、综合详批、姻缘测算、牛年感情、PC版测算、八字合婚、紫微斗数、鼠年运程、月老姻缘、许愿祈福、号码解析、塔罗运势、脱单占卜、感情继续、脱单占卜、塔罗爱情、心理有你、能否复合、暗恋对象、是否分…