go学习笔记划重点

学习路径:

https://github.com/chai2010/advanced-go-programming-book

https://github.com/astaxie/build-web-application-with-golang

重点一

1 定义三个变量,它们分别初始化为相应的值
	vname1为v1,vname2为v2,vname3为v3
	编译器会根据初始化的值自动推导出相应的类型
2 vname1, vname2, vname3 := v1, v2, v3
3 现在是不是看上去非常简洁了?:=这个符号直接取代了var和type,这种形式叫做简短声明。不过它有一个限制,那就是它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量。
复制代码

重点二

_(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。在这个例子中,我们将值35赋予b,并同时丢弃34:
_, b := 34, 35

复制代码

重点三

Go里面有一个关键字iota,这个关键字用来声明enum的时候采用,它默认开始值是0,const中每增加一行加1:

package main
import (
  "fmt"
)
const (
  x = iota // x == 0
  y = iota // y == 1
  z = iota // z == 2
  w        // 常量声明省略值时,默认和之前一个值的字面相同。这里隐式地说w = iota,因此w == 3。其实上面y和z可同样不用"= iota"
)
const v = iota // 每遇到一个const关键字,iota就会重置,此时v == 0
const (
  h, i, j = iota, iota, iota //h=0,i=0,j=0 iota在同一行值相同
)
const (
  a       = iota //a=0
  b       = "B"
  c       = iota             //c=2
  d, e, f = iota, iota, iota //d=3,e=3,f=3
  g       = iota             //g = 4
)
func main() {
  fmt.Println(a, b, c, d, e, f, g, h, i, j, x, y, z, w, v)
}


复制代码

重点四

Go之所以会那么简洁,是因为它有一些默认的行为:
  • 大写字母开头的变量是可导出的,也就是其它包可以读取的,是公有变量;小写字母开头的就是不可导出的,是私有变量。
  • 大写字母开头的函数也是一样,相当于class中的带public关键词的公有函数;小写字母开头的就是有private关键词的私有函数。

复制代码

重点五

链接

重点六

Go有goto语句——请明智地使用它。用goto跳转到必须在当前函数内定义的标签。例如假设这样一个循环:
func myFunc() {
  i := 0
Here:   //这行的第一个词,以冒号结束作为标签
  println(i)
  i++
  goto Here   //跳转到Here去
}

复制代码

重点七

For 可以配合while 使用  
Sum  := 1 
For sum< 1000 {
	Sum += sum
} 
for配合range可以用于读取slice和map的数据:
for k,v:=range map {
	fmt.Println("map's key:",k)
	fmt.Println("map's val:",v)
}
复制代码

重点八

链接

重点九

传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择。
Go语言中channel,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)

复制代码

重点十

链接

重点十一

Go语言实现了反射,所谓反射就是能检查程序在运行时的状态。我们一般用到的包是reflect包。如何运用reflect包,官方的这篇文章详细的讲解了reflect包的实现原理,laws of reflection
使用reflect一般分成三步,下面简要的讲解一下:要去反射是一个类型的值(这些值都实现了空interface),首先需要把它转化成reflect对象(reflect.Type或者reflect.Value,根据不同的情况调用不同的函数)。这两种获取方式如下:
t := reflect.TypeOf(i)    //得到类型的元数据,通过t我们能获取类型定义里面的所有元素
v := reflect.ValueOf(i)   //得到实际的值,通过v我们获取存储在里面的值,还可以去改变值
转化为reflect对象之后我们就可以进行一些操作了,也就是将reflect对象转化成相应的值,例如
tag := t.Elem().Field(0).Tag  //获取定义在struct里面的标签
name := v.Elem().Field(0).String()  //获取存储在第一个字段里面的值
获取反射值能返回相应的类型和数值
var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())

复制代码

重点十二

链接

转载于:https://juejin.im/post/5a60069f518825732821782a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值