在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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底层是数组,扩容是指向新数组了。扩容的时候容量每次翻倍。扩容是在容量不够的时候才扩,并不是每次都扩。
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,字符串"" 变量定义了就要使用,否则无法通过编译。 |
请发表评论