今日学习内容
Go语言的数组与切片
1声明和初始化:数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列
Go 语言中的数组是一种 值类型,所以可以通过 new()
来创建: var arr1 = new([5]int)
,这种方式和 var arr2 [5]int
的区别是arr1 的类型是 *[5]int
,而 arr2的类型是 [5]int
。
package main
import "fmt"
func f(a [3]int) {
a[1] = 2
fmt.Println(a)
}
func fp(a *[3]int) {
a[1] = 2
fmt.Println(a)
}
func main() {
var ar [3]int
f(ar)
fp(&ar)
}
上面函数f
并没有修改原数组,想通过传参修改原数组内容,可以通过加操作符&
来实现
1.1数组常量:如果数组值已经提前知道了,那么可以通过 数组常量 的方法来初始化数组
package main
import "fmt"
func main() {
var arrkeyValue = [5]string{3: "Chris", 4: "Ron"}//只有索引3和4被赋值其他置空
for i := 0; i < len(arrkeyValue); i++ {
fmt.Printf("Person at %d is %s
", i, arrkeyValue[i])
}
}
1.2多维数组:用法如下
package main
const (
WIDTH = 1920
HEIGHT = 1080
)
type pixel int
var screen [WIDTH][HEIGHT]pixel
func main() {
for y := 0; y < HEIGHT; y++ {
for x := 0; x < WIDTH; x++ {
screen[x][y] = 0
}
}
}
2切片是对数组一个连续片段的引用,所以切片是一个引用类型,切片也是一个可变长数组。用法如下
声明格式为:var identifuer []tye
初始化格式为:vae slice1 []type = arr1[start:end]
package main
import "fmt"
func main() {
var arr1 [6]int
var slice1 []int = arr1[2:5]
for i := 0; i < len(arr1); i++ {
arr1[i] = i
}
for i := 0; i < len(slice1); i++ {
fmt.Printf("Slice at %d is %d
", i, slice1[i])
}
}
2.1用make()创建一个切片:make
接受2个参数:元素的类型以及切片的元素个数。基本格式如下
var slice1 []type = make([]type, len)
package main
import "fmt"
func main() {
var slice1 []int = make([]int, 10)
fmt.Println("the len is ", len(slice1))
for i := 0; i < len(slice1); i++ {
slice1[i] = 5 * i
}
for i := 0; i < len(slice1); i++ {
fmt.Printf("Slice at %d is %d
", i, slice1[i])
}
}
2.2new()
和make()
的区别:
- new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体);它相当&T{}`。
- make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel
3切片重组:slice1 := make([]type, start_length, capacity)
,其中 start_length
作为切片初始长度而 capacity
作为相关数组的长度。这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组 reslicing,做法如下:slice1 = slice1[0:end]
,其中 end 是新的末尾索引(即长度)
4切片的复制与追加:如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。
package main
import "fmt"
func main() {
sl_from := []int{1, 2, 3}
sl_to := make([]int, 10)
n := copy(sl_to, sl_from)
fmt.Println(sl_to)
fmt.Printf("Copied %d elements
", n)
sl3 := []int{1, 2, 3}
sl3 = append(sl3, 4, 5, 6)
fmt.Println(sl3)
}
文件与目录的默认权限与隐藏权限
3.1文件特殊权限:SUID,SGID,SBIT
SUID
- SUID权限仅对二进制程序有效
- 执行者需要对该程序具有x的访问权限
- 本权限仅在执行该程序过程中有效
SGID
- 用户对于此目录具有r与x的权限时,该用户能进入此目录
- 用户在此目录下的有效群组将会变成该目录的群组
SBIT(只针对当前目录有效)
- 当前用户对于此目录具有w,x权限,亦具有写入的权限时
- 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件
3.2查看文件类型:file命令可以来查看文件类型
命令与文件查询
4.1脚本文件名搜寻:通过which
命令来查看指令的完整文件名放在哪里
4.2文件名的查找:whereis
(查找特定文件),locate
,find
SQL语法
5.1词法结构:SQL输入由一个命令序列组成。一个命令由一个记号的序列构成,并由一个分号(“;”)终结。输入流的末端也会标志一个命令的结束。
--下面是一个(语法上)合法的SQL输入:
SELECT * FROM MY_TABLE;
UPDATE MY_TABLE SET A = 5;
INSERT INTO MY_TABLE VALUES (3, 'hi there');
5.2标识符和关键字:SQL标识符和关键词必须以一个字母(a-z,也可以是带变音符的字母和非拉丁字母)或一个下划线(_)开始。后续字符可以是字母、下划线()*、数字(0-9)或美元符号($)。
5.3常量:在PostgreSQL中有三种隐式类型常量:字符串、位串和数字。
5.3.1字符串常量在SQL中,一个字符串常量是一个由单引号(')包围的任意字符序列,例如'This is a string'
5.3.2位串常量:位串常量看起来像常规字符串常量在开引号之前(中间无空白)加了一个B(大写或小写形式),例如B'1001'。位串常量中允许的字符只有0和1。
5.3.3数字常量:整数,小数,指数等
5.4操作符:+ - * / < > = ~ ! @ # % ^ & | ` ?
- -- 和 /*不能在一个操作符名的任何地方出现,因为它们将被作为一段注释的开始
-
- 一个多字符操作符名不能以+或-结尾,除非该名称也至少包含这些字符中的一个:
- ! @ # % ^ & | ` ?