堆栈是一个有序列表,其中所有插入和删除都在一端(称为顶部)进行。队列是一个有序列表,其中所有插入都发生在一端(后部),而所有删除都发生在另一端(前部)。堆栈有时称为后进先出 (LIFO) 列表,队列称为先进先出 (FIFO) 列表。
package main
import (
"fmt"
)
type Node struct {
Value int
}
func (n *Node) String() string {
return fmt.Sprint(n.Value)
}
// 创建stack
func NewStack() *Stack {
return &Stack{}
}
// Stack结构type Stack struct {
nodes []*Node
count int
}
// 压入stack
func (s *Stack) Push(n *Node) {
s.nodes = append(s.nodes[:s.count], n)
s.count++
}
// 弹出stack
func (s *Stack) Pop() *Node {
if s.count == 0 {
return nil
}
s.count--
return s.nodes[s.count]
}
// 创建queue
func NewQueue(size int) *Queue {
return &Queue{
nodes: make([]*Node, size),
size: size,
}
}
// Queue结构type Queue struct {
nodes []*Node
size int
head int
tail int
count int
}
// queue的压入func (q *Queue) Push(n *Node) {
if q.head == q.tail && q.count > 0 {
nodes := make([]*Node, len(q.nodes)+q.size)
copy(nodes, q.nodes[q.head:])
copy(nodes[len(q.nodes)-q.head:], q.nodes[:q.head])
q.head = 0
q.tail = len(q.nodes)
q.nodes = nodes
}
q.nodes[q.tail] = n
q.tail = (q.tail + 1) % len(q.nodes)
q.count++
}
// queue的弹出func (q *Queue) Pop() *Node {
if q.count == 0 {
return nil
}
node := q.nodes[q.head]
q.head = (q.head + 1) % len(q.nodes)
q.count--
return node
}
func main() {
s := NewStack()
s.Push(&Node{3})
s.Push(&Node{5})
s.Push(&Node{7})
s.Push(&Node{9})
fmt.Println(s.Pop(), s.Pop(), s.Pop(), s.Pop())
q := NewQueue(1)
q.Push(&Node{2})
q.Push(&Node{4})
q.Push(&Node{6})
q.Push(&Node{8})
fmt.Println(q.Pop(), q.Pop(), q.Pop(), q.Pop())
}
执行git pull origin xxx(分支) --rebase之后先push上远程分支。
在本教程中,您将学习如何使用 Golang 中的循环重复代码块执行。
for循环用于迭代序列(即切片、数组、映射或字符串)。
作为与C家族相关的语言,Golang也支持循环式控制结构。
Golang没有while循环,因为当与单个条件一起使用时,for 循环具有相同的目的。
传统for循环
当您事先知道脚本应运行多少次时,将使用for循环。
考虑以下示例,以三种不同的方式显示从1到10的数字。
package main
import "fmt"
func main() {
k := 1
for ; k <= 10; k++ {
fmt.Println(k)
}
k = 1
for k <= 10 {
fmt.Println(k)
k++
}
for k := 1; ; k++ {
fmt.Println(k)
if k == 10 {
break
}
}
}
用于范围声明
for语句支持一种附加形式,该形式使用关键字 range 循环访问计算结果为数组、切片、映射、字符串或通道的表达式
package main
import "fmt"
func main() {
// Example 1
strDict := map[string]string{"Japan": "Tokyo", "China": "Beijing", "Canada": "Ottawa"}
for index, element := range strDict {
fmt.Println("Index :", index, " Element :", element)
}
// Example 2
for key := range strDict {
fmt.Println(key)
}
// Example 3
for _, value := range strDict {
fmt.Println(value)
}
}
字符串上的范围循环
for循环遍历字符串的每个字符。
考虑以下示例,显示“Hello”五次。
package main
import "fmt"
func main() {
for range "Hello" {
fmt.Println("Hello")
}
}
无限循环
for循环运行无限次,除非我们无法中断。
考虑以下示例,多次显示“Hello”。
package main
import "fmt"
func main() {
i := 5
for {
fmt.Println("Hello")
if i == 10 {
break
}
i++
}
}
注意:FOFA搜索关键词不区分大小写
1、搜索页面标题中含有“后台管理”关键词的网站和IP
title="后台管理"
2、搜索HTTP响应头中含有“thinkphp”关键词的网站和IP
header="thinkphp"
技术图片
3、搜索html正文中含有“管理后台”关键词的网站和IP
body="管理后台"
4、搜索公网上的BurpSuite代理
body="Welcome to Burp Suite"
5、搜索根域名中带有“zhe.ink”的网站
domain="zhe.ink"
6、搜索域名中带有"login"关键词的网站
host="login"
7、搜索开放3388端口并且位于中国的IP
port="3388" && country=CN
8、搜索指定IP或IP段
ip="120.27.6.1/24"
ip="120.97.56.1"
9、搜索证书(如https证书、imaps证书等)中含有"phpinfo.me"关键词的网站和IP
cert="phpinfo.me"
10、搜索同时开启3306端口、443端口和22端口的IP
ports="3306,443,22"
11、搜索只开启3306端口、443端口和22端口的IP
ports=="3306,443,22"
12、逻辑运算符
&& -- 表示逻辑与
|| -- 表示逻辑或
如:搜索HTTP响应头中含有"x-pingback"关键词或"thinkphp"关键词的网站和IP
header="x-pingback" || header="thinkphp"
这是ImageMagic中有权限配置文件,需要修改PDF相关的读写权限。
# 打开policy.xml文件
sudo nano /etc/ImageMagick-6/policy.xml
# 修改PDF相关权限,由none改为read|write
<policy domain="coder" rights="none" pattern="PDF" />
# 改为
<policy domain="coder" rights="read|write" pattern="PDF" />
2023年使用人数最多的PHP MVC框架是Laravel。根据Stack Overflow的最新调查,Laravel是世界上最受欢迎的PHP框架,有超过100万的活跃开发人员。
Laravel以其丰富的功能、灵活性和可定制性而闻名,是构建各种Web应用程序的理想选择。
以下是2023年使用人数最多的PHP MVC框架的前五名:
- Laravel
- Symfony
- CodeIgniter
- Yii
- Phalcon
下面是包括前面的前5名PHP MVC框架外,其他普及度较高的框架以及他们的特点介绍:
- Laravel:Laravel是一个功能强大的PHP MVC框架,它提供了丰富的功能,例如路由管理、数据库迁移、模板引擎等。它还有一个活跃的社区,提供了大量的文档和教程。
- Symfony:Symfony是一个稳定而强大的PHP MVC框架,它提供了高度可定制的组件和Bundle的概念,可以帮助开发人员构建高质量的Web应用程序。
- CodeIgniter:CodeIgniter是一个简单而灵活的PHP MVC框架,它具有小巧的体积和快速的执行速度。它适用于那些需要一个快速启动和简单操作的项目。
- Yii:Yii是一个高性能的PHP MVC框架,它提供了丰富的特性,例如活动记录、查询构建器、表单验证等。它也有一个庞大的社区,提供了大量的扩展和插件。
- Phalcon:Phalcon是一个高性能的PHP MVC框架,它以C语言扩展的形式嵌入到PHP中,从而提供了更快速和低内存消耗的应用程序。Phalcon还提供了丰富的特性,例如ORM、路由管理、缓存等。
- CakePHP:CakePHP是一个简单而灵活的PHP MVC框架,它具有强大的数据验证、数据库迁移和模板引擎等功能。它还有一个活跃的社区,提供了大量的插件和扩展。
- Slim:Slim是一个轻量级的PHP框架,它专注于简单性和性能。Slim非常适合构建小型和中型Web应用程序。
- Zend Framework:Zend Framework是一个成熟的PHP框架,它提供了许多强大的功能和工具,例如路由、ORM、缓存等等。
- Lumen:Lumen是Laravel的轻量级版本,它专注于简单性和性能。Lumen非常适合构建小型和中型Web应用程序。
- Yii2:Yii2是Yii的最新版本,它提供了许多新功能和改进。Yii2非常适合构建大型和复杂的Web应用程序。
在选择PHP MVC框架时,需要考虑以下因素:
- 项目的大小和复杂性:对于小型和简单的项目,可以选择轻量级的框架,例如CodeIgniter或Slim。对于大型和复杂的项目,可以选择功能强大的框架,例如Laravel或Symfony。
- 开发人员的经验水平:对于初学者,可以选择易于学习和使用的框架,例如CodeIgniter或CakePHP。对于经验丰富的开发人员,可以选择功能强大和灵活的框架,例如Laravel或Symfony。
- 框架的社区支持:一个有活跃社区的框架,可以获得更多的帮助和支持。
要使用JavaScript的fetch API上传文件,您需要使用FormData对象和fetch函数。
演示如何使用fetch API上传文件:
html<form id="fileUploadForm">
<input type="file" id="fileInput">
<button type="submit">上传</button>
</form>
<script>
document.getElementById("fileUploadForm").addEventListener("submit", function(event) {
event.preventDefault(); // 阻止表单默认提交行为
var fileInput = document.getElementById("fileInput");
var file = fileInput.files[0];
var formData = new FormData();
formData.append("file", file);
fetch("/upload", { // 替换为您自己的上传接口地址
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
});
</script>
我们首先获取文件输入元素和表单元素,然后创建一个FormData对象并将文件添加到其中。
接下来,我们使用fetch函数将表单数据发送到服务器。请注意,我们使用了POST方法并将表单数据作为请求体发送。
最后,我们使用then函数处理服务器响应并将结果输出到控制台。
在JavaScript中,可以使用window对象的onbeforeunload事件来检测页面刷新事件。
以下是一个简单的示例代码:
javascriptwindow.onbeforeunload = function(event) {
event.preventDefault();
event.returnValue = "确定要离开页面吗?";
};
在这个例子中,当用户尝试刷新或关闭页面时,onbeforeunload事件会被触发,然后调用一个函数。在这个函数中,我们阻止了默认行为(即刷新或关闭页面),并设置了event.returnValue属性,以在浏览器中显示一个警告消息。
请注意,这个事件只在用户尝试刷新或关闭页面时才会触发。如果用户点击了一个链接或执行了其他导航操作,这个事件不会触发。
phpinfo()调试也好,在后台查看也好,应该适当隐藏私密信息。
一般只需要查看1,4,8,那么
echo phpinfo(13); // 即可显示模块,配置,基础信息
Name (constant) | Value | Description |
---|---|---|
INFO_GENERAL | 1 | The configuration line, php.ini location, build date, Web Server, System and more. |
INFO_CREDITS | 2 | PHP Credits. See also phpcredits(). |
INFO_CONFIGURATION | 4 | Current Local and Master values for PHP directives. See also ini_get(). |
INFO_MODULES | 8 | Loaded modules and their respective settings. See also get_loaded_extensions(). |
INFO_ENVIRONMENT | 16 | Environment Variable information that's also available in $_ENV. |
INFO_VARIABLES | 32 | Shows all predefined variables from EGPCS (Environment, GET, POST, Cookie, Server). |
INFO_LICENSE | 64 | PHP License information. See also the » license FAQ. |
INFO_ALL | -1 | Shows all of the above. |
在CSS中加载其他字体,主要有两种方式:
使用@font-face规则
@font-face规则允许你在CSS中定义一个字体,然后在你需要的任何地方使用它。以下是一个例子:
css
@font-face {
font-family: "My Custom Font";
src: url("my-custom-font.woff2") format("woff2"),
url("my-custom-font.woff") format("woff"),
url("my-custom-font.ttf") format("truetype");
}
在上面的代码中,我们首先定义了一个新的字体家族"My Custom Font"。然后,我们提供了多个源,包括.woff2, .woff, 和 .ttf。如果用户的浏览器支持其中一种格式,那么它就会被加载和使用。为了提供最佳的兼容性,建议提供多种字体格式。
然后,你就可以在你的CSS中使用这个字体了:
css
body {
font-family: "My Custom Font", sans-serif;
}