通过 unsafe.Pointer 验证切片是引用类型

看过很多文章,都说切片(slice)是引用类型, 但是实际操作中很难通过结果来证明是引用类型,特别是使用 append 函数时,打印切片结果还是没有变化。 现在我们来使用 unsafe.Pointer 来修改切换的 len 属性来证明切片是引用类型。 废话不多说,上代码...

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func main() {
    s := make([]int, 0, 5)
    // 初始化切片数据
    s = append(s, 1, 2, 3)

    // 调用appendSlice方法,给切片添加数据
    appendSlice(s)

    // 打印切片
    fmt.Println(s) // 输出:1 2 3 (说明增加的 100 没有在这儿体现出来)

    // 现在我们来使用黑科技,来证明切片是引用类型
    sh := (*reflect.SliceHeader)(unsafe.Pointer(&s))
    sh.Len = 4

    // 现在重新打印
    fmt.Println(s) // 输出: 1 2 3 100 (现在看到100, 是不是就是说明 appendSlice 方法的修改,已经影响到了外面的slice了,也就证实了slice是引用类型哦)
}

func appendSlice(s []int) {
    s = append(s, 100)
}

补充说明
注意,追加的切片数据不能超过容量哦,不然会引起切片底层数组指针指向新的数组地址,那就不能看出效果了。

go big包Int类型的使用

有一次意外接触了big包的Int类型,在这里简单记录下它的使用.

加法

func main() {
    b1 := big.NewInt(33)
    b2 := big.NewInt(55)
    b1.Add(b1, b2)
    fmt.Println(b1.String())
}
// output 88

减法

func main() {
    b1 := big.NewInt(33)
    b2 := big.NewInt(55)
    b1.Sub(b1, b2)
    fmt.Println(b1.String())
}
// output -22

乘法

func main() {
    b1 := big.NewInt(33)
    b2 := big.NewInt(55)
    b1.Mul(b1, b2)
    fmt.Println(b1.String())
}
// output 1815

除法

func main() {
    b1 := big.NewInt(110)
    b2 := big.NewInt(55)
    b1.Div(b1, b2)
    fmt.Println(b1.String())
}
// output 2

php8.0版本的新特性

https://cloud.tencent.com/developer/article/1765141?from=article.detail.1785167

PHP8正式版发布,带来了注解和JIT
2020-12-25阅读 6450
PHP8 正式版已经发布,它引入了一些重大变更,以及许多新特性和性能优化,包括命名参数、联合类型、注解、Constructor Property Promotion、match 表达式、nullsafe 运算符、JIT,以及对类型系统、错误处理和一致性的改进。
之前的 PHPCon 上听过 Nikic 的一些分享,感兴趣的小伙伴可以查看Nikic 的 PPT

PHP8

在 PHP 官网 也提到了一些新特性和功能说明,我们来看一看

一步步教你如何使用 laradock 搭建项目环境

前言:

看群里和laravel社区有些人对docker不太会使用,在这里我推荐使用laradock来部署我们的项目环境,用laradock部署简单快捷,方便管理,可以为你省出很多时间陪陪家人。现在用laradock一步步搭建环境。

setup 1:

从github上拉去laradock项目

git clone https://github.com/laradock/laradock.git   

setup 2:

进入laradock文件夹,重命名或者复制 env-example 到 .env文件

Laravel 三种中间件作用讲解

昨天在开发过程中,需要使用到中间件的技术,之前都只是简单的认为要增加中间件就往middleware里添加中间件即可。本着周末的时间,就仔细研究了下 $middleware $middlewareGroup $routeMiddleware三个属性,到底是怎么样用的,通过查阅文档和网上资料,可算是搞明白了这三个属性是怎么用的和该怎么用。

$middleware属性:

这个属性称为全局中间件,为什么说是全局中间件呢?因为你的每一次请求,这里面的每个中间件都会执行。

$routeMiddleware属性:

这个属性称为路由中间件,为什么说是路由中间件呢?因为定义在该属性内的中间件,只能在定义路由时候引用。
假设这是我们定义的路由中间件:

protected $routeMiddleware = [
    ...
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
];