1-16
1 通过starport建立博客
TODO
[1] 建立博客.https://docs.starport.com/guide/blog/
2 Go语言基础
2.1 包、变量和函数
包说明
- 包名一般是小写的,使用一个简短且有意义的名称。
- 包名一般要和所在的目录同名,也可以不同,包名中不能包含
-
等特殊符号。 - 包一般使用域名作为目录名称,这样能保证包名的唯一性,比如 GitHub 项目的包一般会放到
GOPATH/src/github.com/userName/projectName
目录下。 - 包名为 main 的包为应用程序的入口包,编译不包含 main 包的源码文件时不会得到可执行文件。
- 一个文件夹下的所有源码文件只能属于同一个包,同样属于同一个包的源码文件不能放在多个文件夹下。
Go语法注意
- 不需要分号,且一行只能写一条语句(因为是一行一行编译的)
- 导入包,不使用,则会报错
注释
与js一致,但官方推荐行注释
// first line
// second line
声明变量
// 通过var关键字声明
var name string
// 如果有初始值,则类型可以被自动推导
var name = 'John'
// 多变量同时声明
var (
name string = 'John'
age int = 18
)
// 函数内,可以用:=代替var(短变量声明)
// 但函数外不可以(因为函数外的每个语句都必须以关键字开始)
// 常量也不可以
func sum(a int, b int) {
res := a + b
return res
}
// 声明常量
// 常量可以是字符、字符串、布尔值或数值
const Pi = 3.14
注意,如果只声明而未赋值,则有以下规则:
- 数值类型为
0
- 布尔类型为
false
- 字符串为
""
(空字符串)
类型系统
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
// int最大值与操作系统有关
// int8表示2^(8-1) = 128 即范围为 -128~128
byte // uint8 的别名
rune // int32 的别名
// 表示一个 Unicode 码点
float32 float64
complex64 complex128
显式转化类型:
i := 42
f := float64(i)
u := uint(f)
float32、float64浮点数有效位
- float32有效位大约为7位
- float64有效位大约为16位
产生有效位的原因是计算机无法完全表示数学中的所有小数,而只能取一些 代表点
文章见:IEEE754标准: 三, 为什么说32位浮点数的精度是"7位有效数".https://zhuanlan.zhihu.com/p/343040291
补充一下字节、位概念
// 字节和位
1byte = 8bit
int8 表示一个8位的有符号整型
bit是最小单元,可以存0或者1
2.2 流程控制
只有一个for循环,且for表达式不带有括号
for i := 0; i < 10; i++ {
...
}
// 也可以模拟while循环
for true {
...
}
条件分支,if也不需要括号
if x < 0 {
return sqrt(-x) + "i"
}
// if与for类似,也可以加上前表达式
if v := 1; v < lim {
return v
}
switch无需单独设置break
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.\n", os)
}
defer 语句会将函数推迟到外层函数返回之后执行
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
// 多个defer会形成defer栈,先进后出
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
// 9 8 7 6 5 ...
2.3 结构、slice和映射
结构体
type Person struct {
name string
age int
}
person := Person{name: "John", age: 18}
fmt.Println("name:", person.name)
fmt.Println("age:", person.age)
slice切片
var arr [100]string
// crate a slice from array
s1 := arr[0:1]
s1[0] = "John"
// create a slice
s2 := []int{1, 2, 3}
// create a slice by make, usually
s4 := make([]int, 5)
// append
s5 := append(s4, 1, 2, 3, 4, 5, 6)
// forEach
for i, v := range s5 {
fmt.Println(i, v)
}
// 注意:切片的零值是 nil。
// nil 切片的长度和容量为 0 且没有底层数组。
map映射
// create a map
m := make(map[string]Person)
// assign
m["John"] = Person{
name: "John",
age: 18,
}
// or shorthand
m["John"] = Person{"John", 18}
// check exist
elem, ok := m["John"]
// delete
delete(m, "John1")
// 注意:映射的零值为 nil 。nil 映射既没有键,也不能添加键。
// make 函数会返回给定类型的映射,并将其初始化备用。
匿名function,与js类似
...
func fibonacci() func() int {
back1, back2 := 0,1
return func() int {
tmp := back1
back1,back2 = back2, (back1 + back2)
return tmp
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
[1] Go语言编程之旅.https://golang2.eddycjy.com/
[2] Go语言核心编程.https://www.jb51.net/books/696984.html#downintro2
[3] Go语言入门教程,Golang入门教程(非常详细).http://c.biancheng.net/golang/
[4] Go 入门的学习笔记.https://github.com/xinliangnote/Go
[5] Go 语言学习资料与社区索引.https://github.com/unknwon/go-study-index#go-%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99%E4%B8%8E%E7%A4%BE%E5%8C%BA%E7%B4%A2%E5%BC%95
[6] Go指南.https://tour.go-zh.org/list
3 Github的fork有什么用?
TODO
4 社工WIFI钓鱼
TODO
[1] 常见社工破解WPA2密码方法及防范措施.http://www.yaowenming.com/A/x9J20vDKd6/
[2] 运用Fluxion高效破解WiFi密码.http://www.yaowenming.com/A/o75NLDOKzW/
5 网络安全
[1] 耗时 24 小时整理了网络安全学习路线,非常详细!.https://xie.infoq.cn/article/08ec243138836c9aced778121
[2] 【千锋】网络安全300集全套视频教程(web安全/渗透测试/黑客攻防/信息安全/代码(...).https://www.bilibili.com/video/BV1Lf4y1t7Mc?from=search&seid=16585170951439317795&spm_id_from=333.337.0.0
6 2021个人总结
TODO
7 Mui邂逅
curl https://codeload.github.com/mui-org/material-ui/tar.gz/master | tar -xz --strip=2 material-ui-master/examples/nextjs-with-typescript
cd nextjs-with-typescript
curl https://codeload.github.com/mui-org/material-ui/tar.gz/master | tar -xz --strip=2 material-ui-master/examples/create-react-app-with-styled-components-typescript
cd create-react-app-with-styled-components-typescript
8 @craco/craco
与 react-app-rewired
类似,能够在CRA创建的应用中不 eject
配置而进行配置
❓ 问题一:Module not found: Error: You attempted to import /Users/jiangjin/Documents/02.coolswap/coolswap-dashboard/*/pages/ReceiveToken which falls outside of the project src/ directory.
原因:Craco无法正确解析*,所以需要给它指明路径,那在Craco中如何配置正确配置@别名呢?
与CRA不同的是,baseUrl要给.,从而让src生效,如下:
// tsconfig.paths.json
{
"compilerOptions": {
// 注意这里
"baseUrl": ".",
"paths": {
"@mui/styled-engine": [
"./node_modules/@mui/styled-engine-sc"
],
// 注意这里,以前是"*",现在是"src/*"
"@/*": [
"src/*"
]
// 注意这里,不能加, 否则无法启动,因为过不了配置验证
}
}
}
注意删除tsconfig.json中的baseUrl
然后再 tsconfig.json
和 craco.config.js
引入这个 tsconfig.paths.json
即可,示例:
// tsconfig.json
{
"extends": "./tsconfig.paths.json",
}
// craco.config.js
/* eslint-disable @typescript-eslint/no-var-requires */
const CracoAlias = require('craco-alias')
module.exports = {
plugins: [
{
plugin: CracoAlias,
options: {
source: 'tsconfig',
/* tsConfigPath should point to the file where "paths" are specified */
tsConfigPath: './tsconfig.paths.json',
},
},
],
webpack: {
alias: {
'@mui/styled-engine': '@mui/styled-engine-sc',
// '@': path.resolve(__dirname, 'src'),
},
},
}
[1] https://www.npmjs.com/package/@craco/craco
9 React-router6如何进行重定向?
Navigate
代替 Redirect
<Routes>
<Route path="/home" element={<Home />} />
<Route path="*" element={<Navigate replace to="/home" />} />
</Routes>
10 Ts扩展window对象
react-app-env.d.ts
/// <reference types="react-scripts" />
// 注意Window是大写W开头
interface Window {
ethereum?: {
isMetamask?: boolean
on?: (...args: any[]) => void
removeListener?: (...args: any[]) => void
}
}