11.5
fmt.Printf:类似C的printf:fmt.Printf("%d",n),不自动换行
fmt.Println:直接输出内容:fmt.Println(n),fmt.Println("helloworld"),自动换行
从import带入的函数的格式:包名.函数名。函数名首字母大写。
go自带函数无包名,首字母小写。eg:printf
for不带括号,当不写分号时,for当while用。
!注意:for和if都必须要带{},并且大括号不换行
switch自带break,不用再手写break。想关闭break用fallthrough
go的switch可以不带参数,在case中写条件表达式;c不行。
todo:指针
11.6
指针: var p *int:定义指针p
&x:x的地址
*p:p的底层值
结构体:
type emm struct{ var x,y int } func main(){ var a emm{} var b emm{1,0} var c emm{x,0} var d &emm{1,0} }
数组:
var a [10]int
切片:左开右闭
var s []int = a[1:4] //s:{a[1],a[2],a[3]},坐标从0开始
切片就像数组的引用
切片并不存储任何数据,它只是描述了底层数组中的一段。
11.7
对“引用”的一个很好的例子:
//len:切片所包含的元素个数;cap:从切片的第一个元素开始数,到其底层数组元素末尾的个数。
但是感觉指令不明确...s[0:]是指延长到从0开始,还是从当前的0开始截呢?
s==[] 等价于 s==nil
声明切片的make语句:
a:=make([]int,x)//x=len=cap
a:=make([]int,x,y)//x=len,y=cap
二维切片:
board:=[][]int{ []int, []int, []int, }
11.11
append:在切片尾部加元素
s := make([]int,5)//建一个长为5的切片 s = append(s,1)//在s后面加一个元素1 //注意:只能加切片的元素,不能用于切片连接
range:遍历
s := []int{2,4,6,8,10} for i,v := range s{//i,v可用_替换 fmt.Println(i,v) }
二维切片的循环建立:
s := make([][]int , y) for i:=1 ; i <= y; i++{ s[i] = make ([]int , x) }
11.12
map:
m := make(map[string]int) m["Bob"]=2333 v := m["Bob"]//v=2333 v1,ok := m["Bob"]//v1=2333 , ok用于检测"Bob"是否存在(true/false) delete(m,"Bob")
//map练习:用string.Fields函数,获得一个map,装有字符串s的每个单词出现个数。
11.13
函数的闭包
就硬莽。
//pos和neg函数的sum相互独立
//返回斐波那契数列的闭包
11.17
方法
好像可以用来替代class,但我本来也不会用class(
相当于
指针接收者:
直接写函数->必须确定指针or值
写指针接收者->写指针or值都可
写成指针接收者貌似是个好习惯。
接口
不太能理解。