prader6

go 指南学习笔记

 

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\n",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 \n是换行符。

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

posted on 2019-12-22 20:30  prader6  阅读(109)  评论(0编辑  收藏  举报

导航