Skip to main content

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位

产生有效位的原因是计算机无法完全表示数学中的所有小数,而只能取一些 代表点

image-20220116231557808

文章见: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
}
}