手机网站做的比较好的/公司企业网站制作需要多少钱
本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好
go的方法有点像js
基础
func main() {fmt.Println("Starting")var p *string = new(string)*p = "hello world"demo := "demo"fmt.Println(*&demo) //这样既然也可以 &得到地址 也就是指针 在通过取值操作 得到数据fmt.Println(*p)for i := 0; i < 10; i++ {fmt.Println(i)if i == 5 {return //结束程序}}fmt.Println("Ending")}
多参数 多返回值形式
func add(a, b int) int {return a + b
}
func add(a, b int) int,int {return a + b,b
}
可变参数
形参部分是slice 动态数组
func add( b ...int) int {return 1
}
之所以可以不用写;就是因为底层go做了优化 所以定义方法时候 {必须跟在方法名字之后
细节-方法的传值
方法的参数传递分为值传递和引用传递(go种的引用传递是通过地址 /指针等方式)
值传递:实际形式参数接收的是数据的拷贝
引用传递:传递的是数据的引用,在函数内修改这个参数,原来的数据也会改变
为了简单记得,只要记得下下面的类型都是引用传递,其他都是值传递既可
- 切片
- 指针/地址
- 映射
- 通道
- 接口
基本就是复合类型加上指针接口 (函数虽然也是存储地址(函数体)的数据类型,但是作为参数也是把这个函数体地址作为值传递拷贝)所以想到达引用传递的效果就需要传递函数的地址(觉得头晕可见含后文)
在java种类传递的对象也是引用传递 但是在go中并不是,go种定义类是结构体的形式,然后创建实列对象有多种方法,只有使用new关键字会返回指针这个时候实列对象名字才是引用,其他方式实列的结构体的是数据本身
/*
*
只有下面的类型是引用传递 传递数据 修改数据会影响到原来的数据 其他的只可以通过传递地址指针实现方法修改元数据
理解引用传递
*/
package mainimport "fmt"// 1. 指针(Pointers)
func modifyValue(x *int) {*x = 42
}// 2. 切片(Slices)
func modifySlice(s []int) {s[0] = 42
}// 3. 映射(Maps)
func modifyMap(m map[string]int) {m["key"] = 42
}// 4. 通道(Channels)
func send(ch chan int) {ch <- 42
}// 5. 函数(Functions)
func callFunction(f func(int) int, x int) int {return f(x)
}func square(n int) int {return n * n
}// 6. 接口(Interfaces)
type Modifier interface {Modify()
}type Data struct {Value int
}func (d *Data) Modify() {d.Value = 42
}func modifyInterface(m Modifier) {m.Modify()
}func main() {// 测试指针a := 10fmt.Println("之前 (Pointer):", a)modifyValue(&a)fmt.Println("修改后 (Pointer):", a)// 测试切片b := []int{1, 2, 3}fmt.Println("之前 (Slice):", b)modifySlice(b)fmt.Println("修改后 (Slice):", b)// 测试映射c := map[string]int{"key": 1}fmt.Println("之前 (Map):", c)modifyMap(c)fmt.Println("修改后 (Map):", c)// 测试通道ch := make(chan int)go send(ch)fmt.Println("Received (Channel):", <-ch)// 测试接口d := &Data{Value: 10}fmt.Println("之前 (Interface):", d.Value)modifyInterface(d)fmt.Println("修改后 (Interface):", d.Value)
}
函数式编程
首先在go种,函数也可以作为参数以及返回值存在 为此就要介绍其他语言也有的匿名函数
匿名函数
func main() {a := 2//匿名函数的使用func(a *int) {container := []int{1, 2, 3, 4, 5}for _, value := range container {if value%2 == 0 {fmt.Println(value)}}}(&a) //即可调用b := func() int {return 1}()fmt.Println(b)f := func() int {fmt.Println("hello world")return 1}f()}
当然匿名参数存在的作用就是可以作为回调函数传参
值得注意的函数类型作为传递时候 申明格式就和go正常申明一样,但是申明go作为参数传递时候,这个时候的参数和返回值只需要申明类型即可
func main(){
r := opation(2, 3, func(a int, b int) int {return a*100 + b})
}
/*
*
主要用途是函数式编程 作用函数的参数和返回值类型可以省略,可以直接使用匿名函数
·回调函数 作为参数只需要申明返回值和参数类型即可
*/
func opation(a, b int, callback func(int, int) int) int {return callback(a, b)
}
闭包函数
首先解释闭包:
闭包(Closure)函数是一种函数,它可以访问其词法作用域(定义时的作用域)之外的变量。换句话说,闭包可以在其函数体内引用定义在函数外部的变量。这些变量称为自由变量。
/*
bitwiseIncrementer 是一个闭包函数,它返回一个函数,该函数每次调用时都会返回一个自增后的整数。
因为返回的函数引用了一个方法的变量 所以这个变量不会s被垃圾回收 所以这个函数可以一直使用
*/
func increment() func() int {a := 0f := func() int {a++return a}return f
}
main.go
ff := increment()fmt.Println(ff)fmt.Println(&ff)v1 := ff()fmt.Println(v1)v2 := ff()fmt.Println(v2)又调用了一个新的闭包函数 创建了新的内存空间 所以这个i也是新生成额变量ff2 := increment()fmt.Println(ff2())
猜猜会输出什么
流程是 :第一个函数返回了一个函数,而这个函数是闭包函数,正常来说函数使用后就被gc垃圾回收,但是由于返回的这个函数引用了这个变量,所以不会被gc,所以多次调用,自增还是改变的这个数据,而有再次调用这个代码得到一个自增函数时候,这个代码块的内容又是重新建立在新内存空间的,其中引用的a 又是新开辟的内存 所以又是1
那么输出这俩个自增函数
fmt.Println(ff)fmt.Println(ff2)
发现这俩个变量 不一样
函数类型深入
细心的可以发现,感觉函数和指针一样,装的数据是地址,指针装的是变量地址,而函数装的就是代码快的地址
由此可以再次测试
// 定义函数变量funcdemo1 := func() {fmt.Println("funcdemo1")}funcdemo2 := func() {fmt.Println("funcdemo2")}// 打印函数的指针地址fmt.Printf("函数代码块的地址 %p\n", funcdemo1)fmt.Printf("函数的地址 %p\n", &funcdemo1)
输出
可以证实,函数的值就是代码块的地址,而也可以对这个函数取地址
感觉和指针一样,指针也是装载地址的数据类型,也可以对指针取地址
funcdemo1 := func() {fmt.Println("funcdemo1")}funcdemo2 := func() {fmt.Println("funcdemo2")}a := 12P := &afmt.Println("对地址取指针的取值操作", *&a)fmt.Println("指针的数值", P)fmt.Println("指针的地址", &P)// 打印函数的指针地址fmt.Printf("函数代码块的地址 %p\n", funcdemo1)fmt.Printf("函数的地址 %p\n", &funcdemo1)
既然知道了这个底层,那么就可以实现俩个函数交换函数体
func main() {// 定义函数变量funcdemo1 := func() {fmt.Println("funcdemo1")}funcdemo2 := func() {fmt.Println("funcdemo2")}swapfunc(&funcdemo1, &funcdemo2)// 现在 funcdemo1 应该调用原来 funcdemo2 的内容funcdemo1() // 现在会调用 funcdemo2
}
func swapfunc(a, b *func()) {//调用传递的参数(*a)() //先对指针取值得到函数体然后执行fmt.Printf("之前的地址: a: %p, b: %p\n", *a, *b)*a, *b = *b, *a // 交换引用fmt.Printf("之后的地址: a: %p, b: %p\n", *a, *b)
}
确实是交换了函数体,这点和二重指针一样的,通过指针地址改变指针中装的地址,这里通过函数地址改变函数中装的函数体地址
而这样就不行
func swapfunc(a, b func()) {//调用传递的参数(a)()fmt.Printf("之前代码的地址: a: %p, b: %p\n", a, b)a, b = b, a // 交换引用fmt.Printf("之后的地址: a: %p, b: %p\n", a, b)
}
传递函数作为参数是,是值拷贝,传递的只是把形参作为副本,形参值是函数体的值,但是形参的地址不是传递的哪个函数地址,所以修改存储的函数体原来的函数不会改变,改变的只是形参
同理如果想要改变指针保存的地址,那么也是需要参数传递指针的地址
细节,如果是在最外部申明的函数,无法取地址
这样就会报错
func main() {//函数本身就是引用类型 无需地址符号即可提取地址fmt.Printf("函数的地址%T\n", funcdemo1)fmt.Printf("函数的地址%p\n", &funcdemo1)swapfunc(funcdemo1, funcdemo2)funcdemo1()}
func funcdemo1() {fmt.Println("funcdemo1")
}
func funcdemo2() {fmt.Println("funcdemo2")
}
相关文章:

go中的方法 func-----数据类型
本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好 go的方法有点像js 基础 func main() {fmt.Println("Starting")var p *string new(string)*p "hello world"demo : "demo"fmt.Println(*&demo) //这样既然也…...

408计算机网络--物理层
一、物理层概述 物理层是干嘛使得? 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 物理层主要任务是确定与传输媒体接口有关的一些特性。定义标准可以理解为插排上的两孔三孔 机械特性:定义物理连接…...

十年,亚马逊云科技合作伙伴网络开启AI新征程
“十年之前,你不认识我,我不认识你,因为云计算我们携手并肩;十年之后,我们仍是伙伴,更是朋友,因为人工智能再次起程。”这就是今天的亚马逊云科技与其合作伙伴的真实写照。 2024年是亚马逊云科技…...

基于Spring Boot的在线医疗咨询平台的设计与实现【附源码】
基于Spring Boot的在线医疗咨询平台的设计与实现 Design and implementation of the computer hardware mall based on Spring Boot Candidate: Supervisor: April 20th, 2024 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师…...

星坤Type-A连接器:创新快充技术,引领电子连接!
快速发展的电子时代,消费者对电子设备的性能和便利性有着更高的要求。特别是在充电和数据传输方面,快充技术和高速传输已成为市场的新宠。中国星坤公司推出的Type-A连接器系列,以其卓越的性能和创新的设计,满足了市场对高效、稳定…...

入门JavaWeb之 Response 下载文件
web 服务器接收到客户端的 http 请求 针对这个请求,分别创建一个代表请求的 HttpServletRequest 对象,代表响应的 HttpServletResponse 对象 获取客户端请求过来的参数:HttpServletRequest 给客户端响应一些信息:HttpServletRe…...

Java自定义注解校验token并直接返回给前端状态
自定义注解 CheckToken import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public int…...

C++ | Leetcode C++题解之第200题岛屿数量
题目: 题解: class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …...

Linux安全配置
Linux系统审计信息有:系统启动日志(boot.log)、记录用户执行命令日志(acct/pacct)、记录使用su命令的使用(sulog)、记录当前登录的用户信息(utmp)、用户每次登陆和退出信…...

vue实现不预览PDF的情况下打印pdf文件
前景:默认情况,实现打印需要根据预览的内容进行打印。 但是当只有打印按钮存在,不预览文件内容的情况下,实现打印的话,可以通过后端接口返回服务器上PDF的地址,前端通过隐藏的iframe标签中src可实现预览功能 主要是根据…...

C++ | Leetcode C++题解之第199题二叉树的右视图
题目: 题解: class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> rightmostValueAtDepth;int max_depth -1;stack<TreeNode*> nodeStack;stack<int> depthStack;nodeStack.push(ro…...

[leetcode]圆圈中最后剩下的数字/ 破冰游戏
. - 力扣(LeetCode) class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };...

mysql数据库的管理
目录 一、常用的数据类型 二、MySQ数据库基础操作 1、登录数据库 2、查看当前的 MySQL 版本信息及连接用户名 3、查看当前服务器中的数据库 4.查看数据库中包含的表 5.查看表的结构(字段) 6、MySQL的6大约束属性 三、SQL…...

Java项目分层(持续更新中)
第一次更新时间2024.6.26 分包 实体类 功能类 工具类 分层 实体类层 我们要操作的对象,Book,Student... 控制层 控制请求转发 业务层 处理业务 数据层 连接数据库 处理数据 工具类层 JDBC等工具类 测试层 最终启动项目 明确我们所要做的业务之后&a…...

2024年软件测试面试题大全【答案+文档】
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、面试基础题 简述测试流程: 1、阅读相关技术文档(如产品PRD、UI设计…...

数据赋能(131)——体系:数据转换——概述、关注焦点
概述 数据转换是指将数据从一种格式、结构或类型转换为另一种格式、结构或类型的过程。 数据转换操作属于数据整理过程。 它通常涉及数据清洗、数据映射、数据合并、数据拆分等操作,以确保数据的正确性和一致性。 数据转换的目的在于将原始数据转换为更易于处理…...

【自然语言处理系列】掌握jieba分词器:从基础到实战,深入文本分析与词云图展示
本文旨在全面介绍jieba分词器的功能与应用,从分词器的基本情况入手,逐步解析全模式与精确模式的不同应用场景。文章进一步指导读者如何通过添加自定义词典优化分词效果,以及如何利用jieba分词器进行关键词抽取和词性标注,为后续的…...

TikTok短视频矩阵系统
随着数字化时代的到来,短视频已成为人们获取信息、娱乐消遣的重要渠道。TikTok,作为全球最受欢迎的短视频平台之一,其背后的短视频矩阵系统是支撑其成功的关键因素。本文将深入探讨TikTok短视频矩阵系统的构成、功能以及它在新媒体时代中的影…...

码题杯:我会修改图
原题链接:码题集OJ-我会修改图 题目大意:给你一张n个点(编号为1∼n),m条边(编号为1∼m)的无向图,图上每个点都有一个点权,权值分别为a1,a2,…,an&…...

MongoDB Map-Reduce 简介
MongoDB Map-Reduce 简介 MongoDB 是一个流行的 NoSQL 数据库,它使用文档存储数据,这些数据以 JSON 格式存储。MongoDB 提供了多种数据处理方法,其中 Map-Reduce 是一种用于批量处理和聚合数据的功能强大的工具。Map-Reduce 允许用户对大量数…...

某平台小程序逆向思路整理
一、下载软件 devtools 二、强制打开控制台 根据返回的数据我们得知数据被加密了 找到这个加密的js 发现加密的位置 打断点进入这个加密的方法 之后自定义js。python调用解密即可。...

黑马苍穹外卖6 清理redis缓存+Spring Cache+购物车的增删改查
缓存菜品 后端服务都去查询数据库,对数据库访问压力增大。 解决方式:使用redis来缓存菜品,用内存比磁盘性能更高。 key :dish_分类id String key “dish_” categoryId; RestController("userDishController") RequestMapping…...

鸿蒙开发系统基础能力:【@ohos.systemTime (设置系统时间)】
设置系统时间 本模块用来设置、获取当前系统时间,设置、获取当前系统日期和设置、获取当前系统时区。 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import systemTime …...

CVE-2020-26048(文件上传+SQL注入)
简介 CuppaCMS是一套内容管理系统(CMS)。 CuppaCMS 2019-11-12之前版本存在安全漏洞,攻击者可利用该漏洞在图像扩展内上传恶意文件,通过使用文件管理器提供的重命名函数的自定义请求,可以将图像扩展修改为PHP…...

【面试题】信息系统安全运维要做什么
信息系统安全运维是确保信息系统稳定、可靠、安全运行的一系列活动和措施。 其主要包括以下几个方面: 1.系统监控: 实时监测信息系统的运行状态,如服务器的性能指标、网络流量、应用程序的运行情况等。通过监控工具,及时发现系统…...

引导过程与服务器控制
一、引导过程 1.开机自检 服务器主机开机以后,将根据主板 BIOS 中的设置对 CPU(Central Processing Unit, 中央处理器)、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移 交系统控制权,…...

前置章节-熟悉Python、Numpy、SciPy和matplotlib
目录 一、编程环境-使用jupyter notebook 1.下载homebrew包管理工具 2.安装Python环境 3.安装jupyter 4.下载Anaconda使用conda 5.使用conda设置虚拟环境 二、学习Python基础 1.快排的Python实现 (1)列表推导-一种创建列表的简洁方式 (2)列表相加 2.基本数据类型及运…...

在Ubuntu上安装和配置配置服务器防火墙(CSF)的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Config Server Firewall(CSF)是大多数 Linux 发行版和基于 Linux 的 VPS 的免费高级防火墙。除了基本的防…...

Python-井字棋
井字棋 1.设计登录界面1.1导入需要的工具包1.2窗口显示1.3登录界面图片显示1.6标签按钮输入框显示 2.登录功能实现2.1用户数据存储 2.2登录和注册2.2.1登录功能实现2.2.2注册功能实现 3.井字棋游戏3.1 导入需要的工具包3.2 窗口显示3.2 按钮标签显示3.3 棋盘设置初始状态3.4 游…...

39.客户端与服务端断开事件handler
客户端与服务端断开有两种情况: 1.正常断开,客户端调用了ctx.channel().close(); 2.异常断开,比如客户端挂掉了 服务端定义handler来处理连接断开情况下要进行的逻辑操作: package com.xkj.server.handler;import com.xkj.ser…...