1:小问题
1:内存不足会把进程给杀掉
2:go build -o 指定目录(默认go path下,最好放到bin目录下) 编译文件的目录( path下面的src找文件,src需要省略)
3:问题出现在哪里?
package add
var Name string
Name = hello
编译型语音,执行必须要有入口,这个变量赋值不在函数里面,也没有入口,所以找不到,编译就会报错,可以放到一个函数里,在main里面调用,或者声明就初始化(推荐)
var Name int = 100
func init(){
Name = 10
}
最终还是10(全局变量先执行)
4:main->add->test
执行test->add->main
全局变量是和包对应的,所以都是Name不会覆盖
2:基本类型学习
1:关键字:
const,break,else,switch,fallthough,chan,map,if,type,go....
2:别名:
import = a learn/add
3:init
mian执行之前会调用init函数
4:const
只读的,编译初始化后值就确定了,只能修饰bool,num(int,float,complex),string
const a string = qqq || const a = string
a=0,后面自动+1
const (
a = iota
b
c
)
5:变量
1:批量定义
var(
a int
b int = 5
c = 5
)
2:引用-栈与堆
引用类型:指针,slice,map,chan
值类型:栈分配
引用类型:堆分配
一个函数比如定义 var a = 1 调add函数,add(a) 开始函数会存放在栈中做一个现场保护,后面会新开一个栈,栈先进后出,go里面一个栈最大就几k。栈是一种数据结构很高效。函数结束内存就会回收,除非出现内存泄露。
堆每个线程都可以使用,所以必然有加锁解锁过程,所以效率较低。需要垃圾回收GC
例题:交换a,b值。
a:=1
b:=2
swap(&a, &b)
如果函数里面只交换地址可以吗
a, b = b, a
不可以,因为ab是外面地址的复制,交换地址只是交换了函数内参数的地址,外面的地址没有改变
3:变量的作用域
函数内部,局部变量,作用函数内
函数外,全局变量,作用于整个函数,首字母大写,可以被外面的包使用
一个语句块里面的变量也是只适用于这个语句块的
例题:答案:G,O,G。如果是a= o 就是G,O,O
int32 是32位,一个字节8位,所以是4个字节
6:数据类型和操作符
生成随机数:种子如果设置的固定的,每次函数重新运行都会得到和上一次相同的序列
rand.Seed(time.Now().Unix()) //rand.Seed(10) for i := 0; i < 10; i++ { a := rand.Intn(100) fmt.Println( 第%d个随机数 , i, a) }
字符:byte
反引号内的内容,不会做转义
1:print:
%v :原样打印,比如byte a := 'a' 就是97
%#v:相应GO的语法表示
%T:打印类型
3:函数
1:函数类型
函数也是一种类型,可以赋值给变量,参数传递,函数不能比较
2:可变参数:
func add(arg... int) int{} 0个或多个参数
len(arg)就是参数长度
arg[0]第一个参数
3:defer
1:多个defer先进后出顺序执行(放到栈里)
2:defer的变量在声明时参数就确定了
i:=0
defer fmt.Println(i)//0
i++
资源关闭,锁释放
4:匿名函数
defer func(){
fmt.Println(1)
}()
匿名函数为什么后面有个括号,我之前一直不理解,假设是有名字
那就是 func aaa(){} 调用就是aaa()
所以去掉aaa就简化成了</