go最基础语言特征

12,函数指针,指针函数

函数指针:一个指针。指向函数的指针。函数默认就是指针类型。还有slice,map, function

指针函数:一个函数。函数的返回值是指针。

把指针用做参数。调用之后会修改原值。与值传递不同。

用途:指针用于值传递类型。slice,map等本身就是指针,就无需再使用。

11,指针,指针数组,数组指针

Var a = 10
var p1 * int
p1 = &a;
&p1 取地址
*p1 取内容
 
 
指针的指针
var p2 ** int
p2 = &p1;
 
 p2的值是p1的地址
*p2 是 p1的值,a的地址
**p2 是 a的值10
 
 
数组指针:指向数组的指针。*[4]Type
指针数组:数组里每一个元素都是指针。[4] * Type. arr3 = [4] *int { &a, &b, &c, &d }
 
* 在前面是指针,执行一个数组的地址
[]在前面是数组,里面元素是指针
 
**[],指针,指向的内容又是一个指针。

10,函数

defer:延迟到最后执行。主函数所有执行完毕再执行。

例如:文件打开。defer close(); 对象关闭,临时文件删除。

多个defer函数调用,是栈结构。先进后出。

如果发生传递参数,则以传进去时为准,后面变化跟传进去时没有关系了。

defer函数调用后,才是panic或才是return。

传参

值传递:基本数据类型,array,struct。复制一份副本。注意

引用传递:slice,map,channel。参数指向同一块内容。

可变参数:是切片。func getSum(nums ... int) {} 调用:getSum(1,2,3)

s1 := []int{1, 2, 3}; getSum(s1...)

返回值:getSum() (sum int) {}

多返回值

函数的本质
fun fun1 (int, int) {
}
函数的定义跟变量一样,也是开辟一块内存空间
%T是函数定义。
fun1是地址。看做函数名对应的函数体的地址。
var c func(int, int) // c是nil
c = fun1 // 将函数体的地址赋给c
 
回调函数
func add(a, b int) int { return a + b }
func oper(a, b int, fun func(int, int) int) int {
fun地址
return fun(a, b)
}
简单点说,跟js的函数一样,唯一的差别是需要声明参数和返回值的类型。
匿名函数,回调函数,闭包都一样。
 

9,array,slice和map

map,跟js的对象很像。但这一组key和value的值是相同的。不能混搭。

var map1 map[int]string //没有初始化,是nil,无法直接使用     map1 == nil //true

var map2 = make(map[int]string) // 盘子里没饺子   map1 == nil // false

var map3 = map[key类型]value类型{key: valule} // 盘子里有饺子   map1 == nil // false

value, ok := map[key]

ok 可以判断key是否存在。

if ok { //对应的值

} else { //不存在key }

len(map) // key的个数

delete key存在删除,key不存在则不影响

循环:用for range,如果想排序,可以借助slice。sort.Ints(keys),  sort.Strings(s1),按字符串编码排序

array和slice的区别
数组的长度固定,数组是值类型(值类型有基本数据类型,结构体类型),slice的值长度可变,属于引用类型(引用类型:字典类型,通道类型,函数类型)切片是引用传递,所以它们不需要使用额外的内存并且比使用数组更有效率。

如果传递的是引用类型,那么就是“传引用”,如果传递的是值类型,那么就是“传值”(会把以前的数据复制一遍)

数组长度在声明的时候就必须给定,并且之后不会再改变。

slice类型的字面量中只有元素类型,没有长度。切片长度可以自动随着元素数量的增长而增长,但不会随着元素数量的减少而减少。

数组的容量=长度,不可改变。

slice底层是数组,扩容是指向新数组了。扩容的时候容量每次翻倍。扩容是在容量不够的时候才扩,并不是每次都扩。

make(类型,长度,容量) // 类型如[]int,10,100

slice:变长数组。痛点是长度固定。 

在已有数组上创建切片,在没有扩容前执行原数组。

深拷贝与前拷贝:其中copy非常灵活。

数组:相同数据类型的一组数。值复制。相同数据类型 arr1 == arr2,比较的里面的值和长度,而不是地址。

js中的数组,本质是slice,而不是go中的数组。

8,语句

if statemennt; condition {}。例如:if num:=10; num%2==0 {} // num只能在if里面使用

switch 省略后面的变量相当于true,也可以有表达式,用法跟if相同。

 

fullthrough,穿透case:

for

 变现写法。但变量作用域变了。

for {} 省略了表达式2,永真,相当于while(true)

goto loop

没有while,do while

7,输入输出

输出:print

print, printf, println

%v, %T, %t, %s, %c字符,%f, %d,  %p 地址

%b 二进制

%o 八进制

%x 0-9, a-f

%X 0-9, A-F

输入:scan,阻塞式

scanln, scanf

bufio包:文件读写。

6,运算符

div := a / b  //取商

mod := a % b //取余,也叫取模

++,--做了精简,只能作为表达式,不参与运算。

5,基本数据类型转换

int()

4,字符串

单引号,与双引号区别是:'A'是65(ascii码),双引号才是A

中国的gbk,兼容了ASCII码

Unicode统一编码,规范

utf-8,utf-16,utf-32 存储

d 单引号时,编码值

c, q

``和""都可以包字符串,而且可以互相包

字符串与byte的关系,太奇妙了,本质是字符串都是编码。

3,数据类型

基本数据类型:布尔型、数字(整数,浮点数,复数,byte)、字符串 

复合数据类型:array,slice,function,pointer,struct,interface,channel等

int, uint跟平台有关。

byte是uint8的别称

rune是int32的别称

go语言的+只能连接

2,常量

一组常量,如果某个常量美原油初始化,默认和上一行一致。

const (

a int = 100

b

c string = "hello"

d

)

// b也是100

// c

可以枚举

iota,特殊常量,可以被编译器修改的常量,被用作枚举值

const (

a = iota // 0 第一次定义,是0

b = iota // 1  又定义一个常量,是1

c = iota // 2

)

const (

d = iota // 0 再次从零计算。跟const配对

e // 1

)

const (

MALE = iota // 0

FEMALE // 1

UNKNOWN  // 2

)

1,变量

go是静态语言,变量的类型和赋值必须一致。

简短定义方式,左边的变量名至少有一个是新的

简短定义方式,不能定义全局变量

变量的零值,也叫默认值。数字0,字符串""

变量定义了就要使用,否则无法通过编译。

原文地址:https://www.cnblogs.com/zccst/p/14018275.html