四月二十九号日报

今日学习内容

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\n", 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\n", 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\n", 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", 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操作符:+ - * / < > = ~ ! @ # % ^ & | ` ?

  • -- 和 /*不能在一个操作符名的任何地方出现,因为它们将被作为一段注释的开始
  • 一个多字符操作符名不能以+或-结尾,除非该名称也至少包含这些字符中的一个:
    ! @ # % ^ & | ` ?

posted on 2019-10-07 22:19  SWTCZB  阅读(101)  评论(0编辑  收藏  举报

导航