1 If for 后面没有小括号。后面的花括号,要在当前行,并且中间有内容,右花括号要单独一行。
因为go会格式化代码,自动插入分号。
2 函数和方法的区别:
方法需要有一个接受者(selector)实列的函数。这个实例必须在和方法同样的包中生命。
func Add(a ,b int){ //函数
fmt.Println(a+b)
}
func (a myInt) Add (b myInt){ //方法
fmt.Println(a+b)
}
参考文章:https://blog.csdn.net/zyc88888/article/details/80307008
3 首写是大写的字母的名称是被导出的。
4 括号后面的int是返回值的类型。 返回值的个数和函数中返回值的个数对应。可以有多个返回值。
func add(x int, y int) int{
return x + y
}
5 var 语句定义了一个变量列表。
6 := 在go中是简洁赋值语句,只能用在函数内部。函数外部,需要用var,func等语句开头。
在函数中,`:=` 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。
7
Go 的基本类型有Basic types
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 代表一个Unicode码
float32 float64
complex64 complex128
8 fmt.Printf(" x is type of %T",x)
可以确定x数值的类型。
9 常量用const定义不能使用:=语法定义。
10 byte为什么要&0xff 这样能保证符号位不变
0xff 的二进制位为 11111111
在进行& 运算时,高位补0 所以,可以保证另一个数的低8位不变。
参考文章:https://blog.csdn.net/i6223671/article/details/88924481
11 math.Sqrt() 是开平方根的意思。
12 math.Pow(x, n)
返回的是x 的n次方。
13 fmt.Printf("%g >= %g ",v,lim)
v 和lim 能代替前面的 %g v,代替第一个 lim 代替第二个。
14 go语言 牛顿法开平方:
作为练习函数和循环的简单途径,用牛顿法实现开方函数。
在这个例子中,牛顿法是通过选择一个初始点 z 然后重复这一过程求 Sqrt(x) 的近似值:
为了做到这个,只需要重复计算 10 次,并且观察不同的值(1,2,3,……)是如何逐步逼近结果的。 然后,修改循环条件,使得当值停止改变(或改变非常小)的时候退出循环。观察迭代次数是否变化。结果与 [[http://golang.org/pkg/math/#Sqrt][math.Sqrt] 接近吗?
提示:定义并初始化一个浮点值,向其提供一个浮点语法或使用转换:
func main() {
fmt.Println(sqrt(3))
}
func sqrt(x float64)float64{
z := x
for i := 0; i < 10 ; i++ {
z = z - (z*z -x)/(2*z)
}
return z
}
15 switch 匹配成功会自动停止。
16 没有条件的switch和switch true 一样。
17 defer 可以延迟一个函数的执行。
Defer 延迟函数的 执行顺序是后进先出。
被defer延迟的函数的实参(如果是方法,还包括方法的接收者),在defer语句出就会计算,而不是等到调用时才计算。
18 go语言有指针,指针指向了变量的内存地址。
var i = 10
p := &i
&会生成其作用对象的指针,上面i的指针就赋值给了p
fmt.PrintLn(p)
fmt.PrintLn(*p)
*符号表示指针指向的底层的值,上面的第一个答应的p会打印一个内存地址,第二个p会答应10
Go 语言没有指针运算。
19 struct 表示的是结构体,表示的就是一个字段的集合。
20 结构体中的字段使用.号来访问。
type Vertex struct {
x int
y string
}
func main() {
v := Vertex{100, "56565656"}
v.x = 66
fmt.Println(v.x)
}
20 结构体的字段可以通过,结构体的指针访问,并且这种间接访问可以改变结构体字段的值。
21 p = Vertex{x:10} 只列出x的值,没给y的值。
22 类型 [n]T 是一个有 n 个类型为 T 的值的数组。
23 是换行符。
24 []T是一个元素类型为T的且切片(slice)。
25 s[lo:hi]
表示从lo到hi-1的元素,包含头不包含尾。其他的切割形式也是。
26 slice由make创建会返回一个零长度的数组,并且返回一个slice指向这个数组。
b := make([]int,0,5)
这个make 定义了一个长度为0,空间为5的数组,并且返回了这个数组的切片b
27 数组赋值的时候,空间大小会直接传递过去,赋予的只是值。
28 slice 的0值是nil
29 append函数可以向slice添加元素。
func append(s []T, vs ...T) []T
第一参数,是原来的slice,返回的是一个原来的元素添加了新元素的slice。
30 range可以对slice或map进行循环,取到的第一个值是,元素的下标,第二个值是元素的值。
31 fmt.Println( 1 << uint(i) )
会返回2,4,6,8这样的一个二进制序列。
31 map 映射键到值。
Map使用之前需要使用make而不是new来创建,值为nil的map是空的,而且不能赋值。
type Vertex struct{
Lat, Long float64
}
var m map[string]Vertex
func main(){
m = make(map[string]Vertex)
m["bell lab"] = Vertex{
Lat: 100.2,
Long: 1559.5,
}
fmt.Println(m)
}
上面的是string是键,Vertex是值。
32如果顶级的类型只有类型名的话,可以在文法的元素中省略键名。
33 map[key] = value 向map中插入或者修改一个元素。
34 delete(map,key)删除map中某个元素。这个元素被删除后,重新取这个元素,会显示这个元素类型的零值。
35 u,v =map[key] 第一u,显示的是这个元素的 值。如果元素被删除,则显示的是这个元素类型的0值。u表示这个元素是否存在,如果存在u显示为true,如果不存在显示为false。
36 函数也可以当作值。
37 go函数可以是闭包。闭包就是,可以读取函数内部局部变量的函数。
闭包就是能够读取其他函数内部变量的函数。
闭包使得函数中的变量一直在内存中,
https://www.cnblogs.com/cxying93/p/6103375.html
https://www.cnblogs.com/hzhuxin/p/9199332.html
38 斐波那契数列 :从第三项开始,之后的每一项都是前两项的和。
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
package main
import "fmt"
func fibonacci() func()int{
x := 0
y := 1
return func() int {
z := x + y
x, y = y,z
return z
}
}
func main(){
f := fibonacci()
for i := 0 ;i < 10 ;i++ {
fmt.Println(f())
}
}
39 go 语言没有类,不过仍然可以在结构体类型上定义方法。
方法的接收者,放在 func 和方法名之间。
40 type 可以定义函数类型,结构体类型,接口类型,定义等价类型(相当于类型重命名)。
type 在switch中还可以进行类型查询。
https://blog.csdn.net/hzwy23/article/details/79890778
https://www.cnblogs.com/craneboos/p/8615476.html
41 可以对任意类型定义方法,而不仅仅针对结构体。
42 接口是一组方法的集合。
只要 这个方法的 fucname result arguement 和接口中的方法一直,就认为,这个方法实现了接口。
结构体是,实现方法的接收者。
43 类型通过实现接口的方法,实现接口。这样实现了接口和类型之间的解耦。
44 return fmt.Sprintf("%d.%d.%d.%d",i[0],i[1],i[2],i[3])
可以返回格式化之后的字符串。
45 return fmt.Sprintf("cannot Sqrt negative number: %v",float64(e))
上面这行,代码使用%v可以实现值的替换,可是使用%d没办法实现值的替换。看了下源码,没看完
46 io 包指定了 io.Reader 接口, 它表示从数据流结尾读取。
func (T) Read(b []byte) (n int, err error)
Read用数据填充指定的字节slice,并且返回填充的字节数,和错误信息。
在遇到数据的结尾时,io.eof错误。
47 golang 如何判断变量的类型
func main(){
v := 'A'
fmt.Println(reflect.TypeOf(v))
}
48 fmt.pringLn fmt.Fprint fmt.Sprintf 的各种用法:
fmt.Fprint 格式化,并输出到io.writer
49Web 服务器
包http通过任何实现了http.Handler的值,相应HTTP请求。
50 goroutine 是go运行时环境的轻量级线程。
go f(x,y,z) 开启了一个新的 goroutine 执行f(x,y,z)
X,y,z 是在当前线程中定义的,不过在新的goroutine中执行他们。
51 channal是有类型的管道,在正常情况下,在另一端装备好之前,发送和接受都会被阻塞,可以帮助goroutine实现同步。
Channal可以使用 <- 操作符,来发送或者接收变量。
Ch <- v
于map和slice一样,channel必须使用make创建。
Ch := make(chan int)
52 channel 可以带缓冲区,make 第二个参数作为一个缓冲区,来初始化一个channel。
M := make(chan int, 10)
向channel发送数据的时候,如果缓冲区已满,则会发生阻塞。如果缓冲区已空,从channel中取数据则会发生阻塞。
53 发送者,可以把channel关闭。向一个已经关闭的channel发送值会引发pannic。 Channel 和文件不同,通常情况下不需要关闭他们,只有在告诉接受这没有更多数据的时候,才有必要进行关闭,例如中断一个range
K ,ok := <-c 当channel已经没有值,并且已经被关闭的是偶,第二个ok会被赋值为false。
54 go 的select语句会监听io操作,当io操作发生时,触发相应的操作。
在执行Select语句的时候,运行系统会自动的自上而下的判断每个case中发送或者接收操作可以被立即执行。(立即执行的意思是,当前goroutine不会因操作而阻塞)。
如果有一个或者多个io操作可以执行,select会随机选择一个,否则,如果有defualt则执行defualt,如果defualt都没有则,select会一直等待。
参考文章:https://blog.csdn.net/dwjpeng2/article/details/81700147