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, 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框架可以做的很好,但是我现在没怎么看,还得练

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

在idea中连接mysql

IDE&#xff08;集成开发环境&#xff09;是一种软件应用程序&#xff0c;它为开发者提供编程语言的开发环境&#xff0c;通常集成了编码、编译、调试和运行程序的多种功能。一个好的IDE可以大幅提高开发效率&#xff0c;尤其是在进行大型项目开发时。IDE通常包括以下几个核心组…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

在做题中学习(48):朴素的二分查找

. - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a; 暴力求解 for循环中&#xff0c;从nums[0]枚举到nums[n-1]&#xff0c;依次判断&#xff0c;返回 target的值。 时间复杂度 : O(N) :因为要遍历一遍数组 解法二&#xff1a;二分查找 因为此数组为有序的…

利用Github发现优质的学习项目网址

1. 直接搜索&#xff0c;star的数量越多的项目质量越高 2.Github Trending 地址: https://github.com/trending 3. Gitstar Ranking 地址: https://gistar-ranking.com/ 4. Awesome Topic 地址: https://github.com/topics/awesome

FIFO Generate IP核使用——Data Counts页详解

在Vivado IDE中&#xff0c;当看到一个用于设置数据计数选项的选项卡时&#xff0c;需要注意的是&#xff0c;尽管某些选项值可能因为当前的配置而显示为灰色&#xff08;即不可选或已禁用&#xff09;&#xff0c;但IDE中显示的有效范围值实际上是你可以选择的真实值。即使某些…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

莫比乌斯变换的数学原理

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

# notepad++ 编辑器英文版,如何打开自动换行

notepad 编辑器英文版&#xff0c;如何打开自动换行 在Notepad中&#xff0c;如果你想要开启自动换行功能&#xff0c;可以按照以下步骤操作&#xff1a; 1、打开 Notepad 编辑器。 1.1. 依次点击菜单栏中的【视图】&#xff0c;英文版对应【View】。1.2. 在【视图】下拉菜单…

css---浮动知识点精炼汇总

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 浮动简单理解与介绍 这是我们普通的页面标签效果。 每个标签从上到下依次排列。 浮动顾名思义就是让这个标签飞翔起来。 他飞起来后&#xff0c;后面的标签来到他的位置上。 而浮动的标签就会显示在标签的上面。…

【译】Celery文档1:First Steps with Celery——安装和配置Celery

https://docs.celeryq.dev/en/stable/getting-started/first-steps-with-celery.html#first-steps Celery的第一步 Celery时一个自带电池的任务队列。 本教程内容&#xff1a; 安装消息传输代理(broker)安装Celery并创建第一个任务(task)启动Celery工作进程(worker)并执行任务…

2021-10-21 51单片机两位数码管显示0-99循环

缘由单片机两位数码管显示0-99循环-编程语言-CSDN问答 #include "REG52.h" #include<intrins.h> sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; sbit bpP3^4; bit k1,wk10,wk20; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,1…

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…

设计模式之MVC模式

在编程江湖闯荡多年&#xff0c;我手中打磨过的设计模式多如繁星&#xff0c;但论及经典与实用&#xff0c; MVC&#xff08;Model-View-Controller&#xff09;模式 绝对是个中翘楚&#xff01;它不仅是Web应用的骨架&#xff0c;更是软件架构的智慧结晶。今天&#xff0c;咱们…

DRF解析器源码分析

DRF解析器源码分析 1 解析器 解析请求者发来的数据&#xff08;JSON&#xff09; 使用 request.data 获取请求体中的数据。 这个 reqeust.data 的数据怎么来的呢&#xff1f;其实在drf内部是由解析器&#xff0c;根据请求者传入的数据格式 请求头来进行处理。 drf默认的解…

leetcode刷题记录—回溯

目录 22. 括号生成 39. 组合总和 46. 全排列 77. 组合 79. 单次搜索 回溯全集 22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[&qu…

三维坐标点按剖面分类

一、写在前面 ①配套文件&#xff1a;根据剖面对三维坐标点&#xff08;X,Y,Z&#xff09;分类资源-CSDN文库 ②脱敏处理&#xff1a;蚀变数据已采用随机数生成覆盖 ③剖面坐标按顺序排列在“剖面坐标点.xlsx”文件中 二、3点确定空间中平面方程 原理&#xff1a; 设3点A&…

达梦(DM) SQL聚集函数及日期运算操作

达梦DM SQL聚集函数及日期运算操作 聚集函数MAX、MIN、SUM、AVG、COUNT使用分析函数 sum (…) over (order by…) 可以生成累计和更改累计和的值计算出现次数最多的值 日期运算加减日、月、年加减时、分、秒日期间隔之时、分、秒日期间隔之日、月、年求两个日期间的工作天数确定…