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

Golang笔记

01 = 和 := 的区别?

前者是赋值变量,后者是定义变量

02 指针的作用

指针指向变量的地址,在64位机器上占8个字节
【1 字节(Byte)= 8 位(bit)
1 千字节(KB,Kilobyte)= 1,024 字节(2^10 字节)】
作用

  • 取址然后取值
  • swap函数 交换变量的值
  • 指针接收器来改变结构体里面的值
package main
import "fmt"type Counter struct {count int
}func (c *Counter) Increment() {c.count++ // 增加 "count" 字段的值
}func main() {myCounter := &Counter{} // 创建一个新的 "Counter" 实例。"&Counter{}" 表示我们直接获得了一个指向新实例的指针。fmt.Println("Initial count:", myCounter.count) // 打印初始的计数(默认为0)myCounter.Increment() // 调用 "Increment" 方法来增加计数fmt.Println("Count after incrementing:", myCounter.count) // 打印增加后的计数
}

将输出

Initial count: 0
Count after incrementing: 1

03 Go 允许多个返回值吗?

可以。通常函数除了一般返回值还会返回一个error。

04 Go 有异常类型吗?

有,Go用error类型代替了try…catch. 也可以用errors.New()来定义自己的异常

 _, err := funcDemo()
if err != nil {fmt.Println(err)return
}

05 什么是协程(Goroutine)

协程是用户态轻量级线程
在这里插入图片描述
协程是线程调度的基本单位
在这里插入图片描述
通常在函数前加上go关键字就能实现并发。一个Goroutine会以一个很小的栈启动2KB或4KB,当遇到栈空间不足时,栈会自动伸缩, 因此可以轻易实现成千上万个goroutine同时启动。

06 ❤ 如何高效地拼接字符串

strings.Join ≈ strings.Builder(没有变量拷贝) > bytes.Buffer > “+” > fmt.Sprintf (要用反射获取值)

07 什么是 rune 类型

ASCII 码只需要 7 bit 就可以完整地表示,但只能表示英文字母在内的128个字符,为了表示世界上大部分的文字系统,发明了 Unicode, 它是ASCII的超集,包含世界上书写系统中存在的所有字符,并为每个代码分配一个标准编号(称为Unicode CodePoint),在 Go 语言中称之为 rune,是 int32 类型的别名。

Go 语言中,字符串的底层表示是 byte (8 bit) 序列,而非 rune (32 bit) 序列。

sample := "我爱GO"
runeSamp := []rune(sample)
runeSamp[0] = '你'
fmt.Println(string(runeSamp))  // "你爱GO"
fmt.Println(len(runeSamp))  // 4

08 如何判断 map 中是否包含某个 key ?

package main
import "fmt"
func main() {// 创建一个 mapmyMap := make(map[string]int)// 向 map 中添加键值对myMap["apple"] = 1myMap["orange"] = 2// 检查 key 是否存在value, exists := myMap["apple"]if exists {fmt.Println("The key exists with value:", value)} else {fmt.Println("The key does not exist.")}

09 Go 支持默认参数或可选参数吗?

不支持
不过,有几种方法可以模拟这种行为:
1、使用变长参数

package mainimport "fmt"func printMessage(message string, optionalParts ...string) {fullMessage := messagefor _, part := range optionalParts {fullMessage += " " + part}// 如果没有额外的参数传入,optionalParts 将是一个空切片if len(optionalParts) == 0 {// 处理没有可选参数的情况,比如设定一个默认值fullMessage += " default part"}fmt.Println(fullMessage)
}func main() {printMessage("hello")                   // 使用默认值printMessage("hello", "optional part")  // 不使用默认值
}

2、使用函数重载的方式(通过多个函数): Go 不支持传统的函数重载,但你可以通过创建多个函数来模拟这一点,每个函数有不同数量的参数。

package main
import "fmt"// 没有额外参数的版本,提供默认值
func printWithDefault() {fmt.Println("Printing with default value")
}// 接受一个参数的版本
func printWithOneArgument(arg1 string) {fmt.Println("Printing with argument:", arg1)
}func main() {printWithDefault()printWithOneArgument("GoLand")
}

3、使用结构体和函数方法: 创建一个结构体来保存参数,并为该结构体创建方法。你可以在创建结构体实例时设置默认值。

package mainimport "fmt"type Params struct {Arg1 stringArg2 int
}func NewParams() *Params {// 设置默认值return &Params{Arg1: "default string",Arg2: 42,}
}func (p *Params) DoSomething() {fmt.Printf("Doing something with Arg1: %s and Arg2: %d\n", p.Arg1, p.Arg2)
}func main() {params := NewParams()params.DoSomething()// 修改参数params.Arg1 = "another string"params.DoSomething()
}

10 defer 的执行顺序–后进先出

在 Go 语言中,defer 语句用于安排一个函数调用在当前函数执行结束后进行,无论当前函数是因为遇到 return 语句结束、还是到达函数体末尾结束、抑或是因为 panic 而结束。这在处理资源清理、文件关闭、解锁以及一些其他“清理”工作时特别有用。

package main
import ("fmt""os"
)func main() {// 尝试打开一个文件file, err := os.Open("example.txt")// 如果打开文件时出现错误,返回错误if err != nil {fmt.Println("Error opening file: ", err)return}// 使用 defer 来确保文件会被关闭// 这个语句意味着 "在这个函数的最后,执行 'file.Close()' "defer file.Close()// 我们可以读取文件并执行其他操作data := make([]byte, 100)_, err = file.Read(data)if err != nil {// 如果在读取文件时遇到错误,我们依然可以确保文件会被关闭,因为我们已经使用了 defer。fmt.Println("Error reading file: ", err)return}fmt.Println("File data:", string(data))// 当 main 函数结束时,defer 语句会自动触发并关闭文件。
}

关于 defer 的执行顺序,重要的一点是,如果一个函数内部有多个 defer 调用,它们会以 LIFO(后进先出)的顺序执行(类似栈,最后一个 defer 语句最先执行)。下面是一个具体的例子来解释这个概念:

package mainimport "fmt"func main() {fmt.Println("start")defer fmt.Println("deferred 1")defer fmt.Println("deferred 2")defer fmt.Println("deferred 3")fmt.Println("end")
}

程序的输出将会是

start
end
deferred 3
deferred 2
deferred 1

12 Go 语言 tag 的用处?

1 数据序列化和反序列化

package main
import ("encoding/json""fmt"
)// 定义一个结构体
type Person struct {FirstName string `json:"first_name"`LastName  string `json:"last_name"`Age       int    `json:"age"`
}func main() {// 创建一个 Person 结构体实例person := Person{FirstName: "John",LastName:  "Doe",Age:       30,}// 将 Person 结构体序列化为 JSON 格式jsonData, err := json.Marshal(person)if err != nil {fmt.Println("JSON serialization error:", err)return}// 打印 JSON 数据fmt.Println("JSON Data:", string(jsonData))// 将 JSON 数据反序列化为 Person 结构体var newPerson Personerr = json.Unmarshal(jsonData, &newPerson)if err != nil {fmt.Println("JSON deserialization error:", err)return}// 打印反序列化后的 Person 结构体fmt.Println("Deserialized Person:", newPerson)
}

输出

JSON Data: {"first_name":"John","last_name":"Doe","age":30}
Deserialized Person: {John Doe 30}

2 验证和表单处理

type User struct {Username string `json:"username" validate:"required,min=4"`Password string `json:"password" validate:"required,min=8"`
}

在上面的示例中,标签 validate 用于指定验证规则,例如要求 Username 和 Password 字段不能为空,且密码长度至少为 8 个字符。

3 ORM(对象关系映射)

type Product struct {ID       uint   `gorm:"primary_key"`Name     string `gorm:"size:255"`Price    float64Category string
}

在上面的示例中,GORM 标签用于定义 Product 结构体字段与数据库表列之间的映射关系。

13 如何获取一个结构体的所有tag?

使用Go语言的反射(reflection)机制

package main
import ("fmt""reflect"
)type Person struct {Name     string `json:"name"`Age      int    `json:"age"`Location string `json:"location"`
}func main() {p := Person{Name:     "John",Age:      30,Location: "New York",}// 获取结构体类型t := reflect.TypeOf(p)// 遍历结构体的字段for i := 0; i < t.NumField(); i++ {field := t.Field(i)tag := field.Tag.Get("json") // 获取json标签的值fmt.Printf<

相关文章:

Golang笔记

01 = 和 := 的区别? 前者是赋值变量,后者是定义变量 02 指针的作用 指针指向变量的地址,在64位机器上占8个字节 【1 字节(Byte)= 8 位(bit) 1 千字节(KB,Kilobyte)= 1,024 字节(2^10 字节)】 作用 取址然后取值swap函数 交换变量的值指针接收器来改变结构体里面…...

在Linux上安装RStudio工具并实现本地远程访问【内网穿透】

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…...

leetcode 128. 最长连续序列

2023.10.23 本题思路&#xff1a;遍历所有元素&#xff0c;对当前元素num进行查找&#xff1a;有无元素(num1)、有无元素(num2)......若有则继续查找下去&#xff0c;同时记录最大序列长度&#xff0c;无则遍历下一个元素。 考虑到数组中可能有重复元素需要去重&#xff0c;并且…...

k8s-----4、yaml文件,做资源编排和资源对象部署

yaml文件 1、YAML 文件概述2、YAML 文件书写格式3、资源清单描述方法4、yaml文件编写4.1 没有真正部署资源的过程4.2 资源已经存在的时候 5、yaml文件中必须存在的属性 1、YAML 文件概述 k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式&#xff08;YAML&#xff0…...

proteus中仿真arduino的水位测试传感器

一、原理介绍 我们这里使用的水位传感器&#xff0c;只能说是一个小实验用途的水位传感器。我们首先上图 如上图所示&#xff0c;线没有连接&#xff0c;传感器由许5对裸露在外的铜线片作为传感部分&#xff0c;当浸入水中时这些铜线片会被水桥接。 这些被水连接起来的铜线&a…...

设计模式-单例模式 (Singleton)

单例模式 &#xff08;Singleton&#xff09; 单例模式是一种创建型设计模式&#xff0c;它确保类只有一个实例&#xff0c;并提供了一种访问该实例的全局方法。这种模式有助于确保系统中的某些组件只有一个实例&#xff0c;并提供了一种方便的方法来访问该实例。 1、单例类只…...

程序包org.apache.ibatis.mapping不存在 符号找不到

找不到符号 符号: 类 Cursor和程序包org.apache.ibatis.mapping不存在 在idea中没有错误&#xff0c;但是在linux编辑时报了这两个错误&#xff0c;之前有遇见过符号找不到的问题&#xff0c; 当时的问题是编译的import xxx.xxx.xxx.* 识别不成功过&#xff0c;将*改为…...

Microsoft Edge浏览器中使用免费的ChatGPT

一、双击打开浏览器 找到&#xff1a;扩展&#xff0c;打开 二、打开Microsoft Edge加载项 三、Move tab新标签 获取免费ChatGPT 四、启用Move tab。启用ChatGPT。 扩展 管理扩展 启用 五、新建标签页&#xff0c;使用GPT 六、使用举例 提问 GPT回复...

Python 框架学习 Django篇 (五) Session与Token认证

我们前面经过数据库的学习已经基本了解了怎么接受前端发过来的请求&#xff0c;并处理后返回数据实现了一个基本的登录登出效果&#xff0c;但是存在一个问题&#xff0c;我们是将所有的请求都直接处理了&#xff0c;并没有去检查是否为已经登录的管理员发送的&#xff0c;如果…...

cocos creator 小游戏允许他人访问本地项目

需求背景&#xff1a; 发版成微信小游戏前&#xff0c;需要策划介入体验。不上传微信体验版本 实现&#xff1a; 1.发布平台选择web桌面端 2.构建完成后点击运行从浏览器上获取本地的运行地址 3.winR ——》 cmd 控制台 输入 ipconfig 找到IPv4地址&#xff0c;替换本地部分 …...

分布式存储 vs. 全闪集中式存储:金融数据仓库场景下的性能对比

作者&#xff1a;深耕行业的 SmartX 金融团队 张德敏 近年来随着金融行业的高速发展&#xff0c;经营决策者及监管机构对信息时效性的要求越来越高&#xff0c;科技部门面临诸多挑战。例如&#xff0c;不少金融机构使用数仓业务系统&#xff0c;为公司高层提供日常经营报表&am…...

RHCE---搭建博客网站

一.实验要求&#xff1a; Server-NFS-DNS主机配置NFS服务器&#xff0c;将博客网站资源文件共享给Server-web主机&#xff0c;Server-NFS-DNS主机配置DNS Server-web主机配置web服务&#xff0c;通过域名www.openlab.com可以访问到自建的博客网站 二.准备工作 创建两台虚拟机…...

Spring中方法拦截器

一、MethodInterceptor 在动态代理中要想添加一个额外功能&#xff0c;只要去实现MethodBeforeAdvice这个接口就行了&#xff0c;但是实现了这个接口的额外功能只能运行在目标类执行之前&#xff0c;如果是想在目标类执行之后呢&#xff1f;那这个需求就完成不了&#xff0c;所…...

【网络】HTTPS讲解(侧重于加密、秘钥、证书的讲解)

HTTPS讲解 前言正式开始安全HTTP和HTTPS的关系什么是加密和解密为什么要加密运营商劫持中间人 常⻅的加密⽅式对称加密⾮对称加密 数据摘要数字签名HTTPS 的⼯作过程⽅案 1 - 只使⽤对称加密&#xff08;不可靠&#xff09;⽅案 2 - 只使⽤⾮对称加密&#xff08;不可靠&#x…...

absolute 定位

关于CSS的一些学习记录 absolute定位类型 语法staticrelative 相对定位absolute 绝对定位fixed 固定定位stick 粘性定位 absolute CSS postion属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则决定了该元素的最终位置。 定位类型 定位元素是其计算后…...

比亚迪、吉利、蔚来等将出席2023第四届中国新能源汽车热管理峰会

会议背景 2023第四届中国新能源汽车热管理创新国际峰会将于11月16日-17日在上海举办。会议线上线下同步举行&#xff0c;会场提供中英同声传译。 本次峰会将密切关注“双碳”目标下中国新能源汽车一体化热管理的最新行业动态与关键技术的研发和应用方案。会议将对中国新能源汽…...

OJ第五篇

文章目录 用队列实现栈用栈实现队列设计循环队列 用队列实现栈 链接&#xff1a;用队列实现栈 这道题是让我们用两个队列实现一个栈&#xff0c;简单来说&#xff0c;就是利用队列来实现一个先入后出的功能&#xff0c;我们知道队列是先入先出&#xff0c;如何用两个队列来实…...

【论文解读】Parameter-Efficient Transfer Learning for NLP

一. 介绍 1.1 为什么要引入Adapter 在存在许多下游任务的情况下&#xff0c;微调的参数效率很低:每个任务都需要一个全新的模型。作为替代方案&#xff0c;我们建议使用适配器模块进行传输。 1.2 论文目标 目标是建立一个在所有这些方面都表现良好的系统&#xff0c;但不需…...

星途星纪元 ES,用艺术思维表达工程技术

10月8日&#xff0c;星途星纪元ES携手世界级成都爱乐首席乐团、旅德青年钢琴家王超&#xff0c;在成都打造了一场“万物星声”超舒适音乐会视听盛宴。这是星途星纪元首次跨界音乐圈、牵手音乐挚友&#xff0c;共同演绎音乐和汽车的美学协奏曲&#xff0c;开启高端超舒适美学新纪…...

【Java 进阶篇】深入了解 Bootstrap 插件

Bootstrap 是一个流行的前端框架&#xff0c;提供了各种强大的插件&#xff0c;用于增强网页和应用程序的功能和交互性。本篇博客将深入介绍 Bootstrap 插件&#xff0c;适用于那些刚刚开始学习前端开发的小白。 什么是 Bootstrap&#xff1f; 在深入探讨 Bootstrap 插件之前…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...