Go 中的 &T{...}、new(T)、make(T) 的区别
一、&T{…} &T{...} 可以返回一个 T 类型指针,并且在括号指定初值,只能用于结构体 二、new(T) new(T)与&T{...}基本相同,但不能指定初值(所以一般还是用new(T)),不过除了结构体还可以用于基本类型(如 int ) 三、make(T) make(T)用于创建 3 种内建的引用类型:切片、map 和 channel,如: 1v := make([]int, 10, 50) 这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素 换言之,new 函数分配内存,make 函数初始化;下图给出了区别: 又或者,我们来看 buildin.go 中的注释:
Gin 入门笔记(四)路由传值与动态路由
一、GET 请求传值 GET请求就是在 URL 中携带的参数,如 1http://127.0.0.1:8080/?username=admin&passwd=12345&page=10 就传递了username,password和page三个参数 1234567891011r.GET("/", func(c *gin.Context) { username := c.Query("username") passwd := c.Query("passwd") page := c.DefaultQuery("page", "1") c.JSON(http.StatusOK, gin.H{ "username": username, "passwd": passwd, "page": page, })}) 使用c.Query()接收数据,而使用c.DefaultQuery()还能指定默认值 二、POST 请求传值,获取 form 表单数据 我们现在需要配置两个路由,其中addUser.html需要写模板创建一个表单并向doAddUser.html发送POST请求,而doAddUser.html则只需接收信息并打印出来 12345678910111213141516<!DOCTYPE html><html lang="e...
Gin 入门笔记(三)HTML 模板与静态文件服务
一、 模板配置 模板配置分为两种情况 1. 全部模板放在一个目录 在 templates 里放置所有模板,再在 main.go 里使用r.LoadHTMLGlob("templates/*")即可 2. 模板放在不同目录 这里以下面的结构为例子 12345678910test│ go.mod│ go.sum│ main.go│└─templates ├─back │ index.html //后端页面 └─front index.html //前端页面 在前端页面的开头加上{{ define "front/index.html" }},并在结尾加上{{ end }} 12345678910111213141516{{ define "front/index.html" }}<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="widt...
Gin 入门笔记(二)响应数据 c.String() c.JSON() c.HTML()
从之前程序继续 1234567891011121314package mainimport ( "github.com/gin-gonic/gin")func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.String(200, "%v", "Hello World") }) r.Run()} 在 r.GET 中,我们使用了 c.String ,类似地,还可以使用 c.JSON() 1234c.JSON(200,gin.H{ "success":true, "msg":"你好 gin",}) gin.H 其实就是 map[string]interface{} 的捷径,在里面写上键值对,就能成功访问,可以往里面放各种各样的类型或者结构体返回 而 c.HTML() 是用于渲染模板的(下节详细讲),首先新建一个 templates 文件夹,在其中新建 index.html ,将代码复制进去 1234567891011121314<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-eq...
Gin 入门笔记(一)环境搭建、简单的路由配置
一、Gin 是什么 Gin 是一个用 Go (Golang) 编写的 web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。 同时,它目前在 GitHub 上已经有了 50k+ 的 Star,可谓是非常热门 二、环境搭建 注意:以下步骤需要全程魔法上网 在 VScode 中安装 Go 扩展 新建 test 文件夹,并在其中新建一个 main.go 这时会提醒你下载很多工具,确认下载即可,这里就看你的网速了,记得魔法上网 终端里切换到 test 目录,并执行下面的命令 12go mod init testgo get -u github.com/gin-gonic/gin 新建 main.go ,并输入 1import "github.com/gin-gonic/gin" 再在终端中执行命令 1go mod tidy 这一步执行完毕后,目录中应该会有 go.mod 和 go.sum 两个文件 用下面的代码测试一下 1234567891011121314package mainimport "github.com/gin-gonic/gin"func main() { // 创建一个默认的路由引擎 r := gin.Default() // 配置路由 r.GET("/", func(c *gin.Context) { c.String(200, "%v", &...
『C/C++』VScode 环境配置
2023年5月7日附: 本教程年代久远,加之当时写的也不是很好,亟待更新 但是鄙人最近没有空,简单地录了个视频,建议配套食用 然后扩展有些已经被官方吞了,再加一个好用的扩展,叫 Error Lens,非常好用 Step0:准备安装文件 安装文件包含 VScode 的安装包和著名 C/C++ 编译器 MinGW 你可以选择去官网下,也可以选择通过下面的链接下载 百度云:https://pan.baidu.com/s/1T_j30OCeFneNF5NnxWVOig 提取码:11hx 蓝奏云:https://wwd.lanzouf.com/b030s49yj 密码:8wqk 解压完成后就准备开始了 Step1:安装软件 对于 MinGW 来说,随便放在一个你喜欢的地方 但是请记住它的位置,这里以 C 的根目录为例 对于 VScode ,安装程序一直点下去 Step2:配置运行环境 安装后打开 VScode,需要先装上几个插件,在左侧转到扩展页面,然后按名字搜索 有三个必要的插件,和两个可选的插件 第一个是中文插件,用于显示中文界面 安装后,会提示重启 VScode ,点按钮可以重启 第二个是 C/C++,我们需要用它来运行和调试程序 第三个是 Code Runner,通过这个插件来启动程序更加快捷 下面两个是我比较推荐的,Bracket Pair Colorizer 2 可以给代码中的括号自动配色,突出代码结构 最后一个 Local History 可以保存每次修改的版本,随时回溯历史 下面需要创建一个文件夹保存源代码,我就直接创在桌面了,取名为 ...
『C/C++』动态内存管理
C++动态内存|菜鸟教程 C内存管理|菜鸟教程 C/C++内存管理详解
『C/C++』typedef关键字
这篇内容实际上来源于菜鸟教程 C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE : 1typedef unsigned char BYTE; 在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如: 1BYTE b1, b2; 按照惯例,定义时会大写字母,以便提醒用户类型名称是一个象征性的缩写,但您也可以使用小写字母 您也可以使用 typedef 来为用户自定义的数据类型取一个新的名字。例如,您可以对结构体使用 typedef 来定义一个新的数据类型名字,然后使用这个新的数据类型来直接定义结构变量,如下: 123456789101112131415161718192021222324252627282930#include <stdio.h>#include <string.h> //本人强调:格式不用搞错typedef struct Books //这个类型叫 struct Books{ char title[50]; char author[50]; char subject[100]; int book_id;} Book; //因为有typedef,struct Books 等于 Book(不看大括号就是 typedef struct Books Book; int main( ){ Book book; strcpy( book.title, &quo...
『算法』高精度运算
题目 分解讲解: 1.头部 123456#include <bits/stdc++.h>#define len(k) (k[0]) //k[0]表示数的位数,用len(k)表示更为清晰using namespace std;const int MAXN = 10000;int a[MAXN], b[MAXN], c[MAXN], d[MAXN], tmp[MAXN];int num, res; 2.读入 12345678void scan(int x[]){ char str[MAXN]; scanf("%s", &str); len(x) = strlen(str); for (int i = 0; i < len(x); i++) x[len(x) - i] = str[i] - '0'; //倒序写入} 3.输出 1234567891011void print(int x[]){ if (len(x) == 0) { printf("0\n"); return; } for (int i = len(x); i >= 1; i--) printf("%d", x[i]); putchar('\n');} 4.初始化(清零) 1234void init...
C 真的可以看做是 C++ 的子集吗
搜了一下,答案是:基本上可以这么认为,但是在一些细节上并不兼容 图片源自网络 1. void*类型 在C语言中,void*(空指针)可以隐式转换为任何指针类型,但在C++语言中不合法 2. 字符字面值 在C语言中,字符字面值是int类型,而在C++语言中,字符字面值是char类型 3. 字符串字面值 这是一个很常见的错误,在C语言中,字符串字面值是char[N]类型,而在C++语言中,字符串字面值是const char[N]类型 4. C++ 多了一些关键字 C++多了很多关于面向对象的内容,与之一道多了很多关键字(如class,public等) 使用这些词汇作为变量名的 C 程序无法在 C++ 中成功编译
『About』关于我和我的小站(2021年11月13日版)
欢迎来到我的小站呀,很高兴遇见你!🤝 🏠 关于本站 这个博客网站是我今天(2021年11月13日)在我自己的阿里云服务器上新建的,基于Gridea,非常感谢这个开源项目🎉 主题上我本来想找一个基于 Material Design 的(因为的原来用的是洛谷博客),但逛了一圈都不能很令我满意,就用了这个 Pure 主题,也是挺好看的 有些文章由于我当时年龄较小,语言比较幼稚,望见谅!😂 PS:如果有时候没法正常访问,那么就表明我正在提交我的文章,请稍微等一分钟 👨💻 博主是谁 本人是杭电大一新生一枚,杭电助手后端部新人,正在学习 Golang ,也在慢慢复习高中时信息竞赛的知识(再不复习的话就要全忘啦!)😃 📘 学习经历 初中接触 C,Windows 命令行 高一接触 Linux ,折腾了一段时间的树莓派 高一开始参加 C++ 信息学竞赛,2019年参加了由CCF主办的CSP-S非专业级软件能力认证第二轮,其成绩(等同于原NOIP复赛提高组奖项级别)达到三等 (菜的一批) 高中还学了点WEB三板斧、Python,现在忘得差不多了 现在正在入门 Go,同时买了考研的书慢慢看 📬 联系我呀 QQ:976180942 常用昵称:NickXU(NX)、你这瓜保熟吗(曾用名)、我不是菜鸟(曾用名)、NOTSPROG(就是前面那个的英文) 一般用 KSP 小绿人头像(系KSP老玩家!!!) GitHub ID:NOTSPROG 📢 商务合作 本站不接受任何广告的投放 点击此链接与我进行商务合作
『Go』方法和接口
一、方法 1.方法是什么 你可以为某个类型声明它的专属函数,如为 A 类型声明函数 f 函数 f 就附加在了类型 A 上,使用 A.f() 来调用 这时 f 就称为 A 的 「方法」 类型 A 就称为方法 f 的 「接收者」 方法就是一种带「接收者」参数的函数 2.为什么要使用方法 方法使我们能在Go中运用面向对象的思想来编程(就像C++中的类一样) 3.如何使用方法 3.1 方法的声明 首先复习一下函数的声明格式 1234func 函数名 (参数列表) (返回值列表){// 函数体return 返回值列表} 方法无疑就是多了个接收者参数,位置在 func 和函数名之间 1234func (接收者) 函数名 (参数列表) (返回值列表){// 函数体return 返回值列表} 注意: 你不能在 A 包内为 B 包内的一个类型定义方法,也就是说方法和接收者必须在同一个包里 内建类型无法定义方法,因为这些类型不是你定义的,你也不知道它是在哪个包里定义的 例子:声明一个 point 类型,用于表示一个二维坐标的点,再为它声明一个方法 dis ,用于获取该点到原点的距离。 12345678910111213141516171819202122package mainimport ( "fmt" "math")//声明 Point 类型type Point struct { X, Y float64}//声明 dis 方法func (a Point) dis() fl...
『Go』浅谈 Go 与 C/C++ 语法的不同
看了这么多教程,感觉还是Go 语言之旅最适合新手 本周初学 Go 的基本语法,总结了一下和 C/C++ 的区别 Go 语法与 C/C++ 的不同 (浅谈) 每句话之后不一定要分号了 引用了包,或者变量声明没有用,就不能成功编译 大括号强制使用 C 风格:不换行,不能使用 C++ 风格 Go 的变量声明方面,名称在前,类型在后: 1234var a int // 声明一个变量,默认为0,这和C/C++不一样var b = 10 // 声明并初始化,且自动推导类型c := 20 // 初始化,且自动推导(只能在函数里用) 然后少了一个 char 类型,多了复数 Go 的 for 语句后面的三个构成部分外没有小括号, 大括号 { } 则是必须的(if同理) 没有了While,可以用for代替: 1234567func main() { sum := 1 for sum < 1000 { sum += sum } fmt.Println(sum)} Go的 switch 不需要 break,并且 switch 的 case 无需为常量,且取值不必为整数 defer 语句会将函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。可以defer多个函数,推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。 123456package mainimport "fmt&...
『C/C++』获得函数运行时长
见此代码,输出了几种排序方法的运行时长 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAXSIZE 10000void swap(int *a, int *b){int tmp;tmp=*a;*a = *b;*b = tmp;}void rand_Array(int Array[]){for (int i = 0; i < MAXSIZE; i++)Array[i] = rand();}void selection_sort(int a[],int l, int r){ for (int i = l; i <= r; i++) { int min = i; for (int j = i + 1; j <= r; j++) //走访未排序的元素 if (a[j] < a[min]) min = j; //找到目前最小值 swap(&...
『C/C++』排序算法
感谢菜鸟教程:十大经典排序算法 基础桶排序 进来一个数就丢数组的那个位置里,很好理解 123456789101112131415#include<stdio.h>int a[100],n;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { int tmp; scanf("%d",&tmp); a[tmp]++; } for(int i=0;i<=99;i++) if(a[i])for(int j=1;j<=a[i];j++) printf("%d ",i);} 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 1234567891011121314151617181920212223#include<stdio.h>int a[100000],n;void swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp;}void bubble_sort(int l,int...
『C/C++』指针与函数传参杂谈
2022-05-08更新:针对新的渲染器优化了显示 对于大部分C语言初学者,指针是最大的一块骨头 ——沃兹基·硕德 本节内容: 指针的简单引入 [What] 指针是什么 [Why] 为什么要用指针 [How] 指针怎么玩(声明,使用,运算,数组指针,结构体指针,函数指针) 函数传参的几种方式 值传递 地址传递 引用传递 指针的简单引入 指针是什么 首先,我们要清楚指针是什么,下面是指针的原始定义 系统在内存中,为变量(本人按:这里应加上函数)分配存储空间的首个字节单元的地址,称之为该变量的地址。地址用来标识每一个存储单元,方便用户对存储单元中的数据进行正确的访问。在高级语言中地址形象地称为指针。 指针变量就是保存指针的变量,但很多人 将「指针变量」简称为「指针」,故本文的指针都是指针变量的意思 下面要认两个重要概念:指针的值和类型 「指针的值」 内存地址一般用十六进制数表示,故 指针的值就是一个十六进制数 「指针的类型」 指针不仅是一个地址那么简单,对象不同则类型不同,如指向 int类型 的指针就称这个指针是 int 型的,int 型指针就只能存 int 类型变量 的地址,这种要求可以一定程度上避免混乱。指针的类型用于推断对象的长度,以便进行指针运算(后面会讲) 注意:「泛型对象指针」或称「void*指针」可以指向任何对象类型,但不能提供对象的长度,故无法直接运算与引用 PS:实际上在 C 中是可以隐式(或者说自动)转换的, 但是在 C++ 中不能 ,必须显式(或者说手动)地转换,我建议还是保留显式转换的习惯,这是一个...