虽然这本书是讲goweb,但仍是吧go语言基础过了一遍,因为我以前已经对go语言基础作了一遍系统的学习,这里就当简单回顾一下,再也不写过多笔记了,以前的写的博客都有基础知识,O(∩_∩)O哈哈~git
Go是天生支持UTF-8的,任何字符均可以直接输出,你甚至能够用UTF-8中的任何字符做为标识符。github
Go使用package(和Python的模块相似)来组织代码。main.main()函数(这个函数位于主包)是每个独立的可运行程序的入口点。Go使用UTF-8字符串和标识符(由于UTF-8的发明者也就是Go的发明者之一),因此它天生支持多语言golang
Go语言里面有一个语法,能够直接判断是不是该类型的变量: value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。web
若是element里面确实存储了T类型的数值,那么ok返回true,不然返回false。编程
package main import ( "fmt" "strconv" ) type Element interface{} type List [] Element type Person struct { name string age int } //定义了String方法,实现了fmt.Stringer func (p Person) String() string { return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)" } func main() { list := make(List, 3) list[0] = 1 // an int list[1] = "Hello" // a string list[2] = Person{"Dennis", 70} for index, element := range list { if value, ok := element.(int); ok { fmt.Printf("list[%d] is an int and its value is %d\n", index, value) } else if value, ok := element.(string); ok { fmt.Printf("list[%d] is a string and its value is %s\n", index, value) } else if value, ok := element.(Person); ok { fmt.Printf("list[%d] is a Person and its value is %s\n", index, value) } else { fmt.Printf("list[%d] is of a different type\n", index) } } }
Go语言实现了反射,所谓反射就是能检查程序在运行时的状态。咱们通常用到的包是reflect包。如何运用reflect包,官方的这篇文章详细的讲解了reflect包的实现原理,laws of reflection并发
使用reflect通常分红三步,下面简要的讲解一下:要去反射是一个类型的值(这些值都实现了空interface),首先须要把它转化成reflect对象(reflect.Type或者reflect.Value,根据不一样的状况调用不一样的函数)。这两种获取方式以下:app
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())
最后,反射的话,那么反射的字段必须是可修改的,咱们前面学习过传值和传引用,这个里面也是同样的道理。反射的字段必须是可读写的意思是,若是下面这样写,那么会发生错误ui
var x float64 = 3.4 v := reflect.ValueOf(x) v.SetFloat(7.1)
若是要修改相应的值,必须这样写
var x float64 = 3.4 p := reflect.ValueOf(&x) v := p.Elem() v.SetFloat(7.1)
上面只是对反射的简单介绍,更深刻的理解还须要本身在编程中不断的实践。
var和const参考2.2Go语言基础里面的变量和常量申明
package和import已经有太短暂的接触
func 用于定义函数和方法
return 用于从函数返回
defer 用于相似析构函数
go 用于并发
select 用于选择不一样类型的通信
interface 用于定义接口,参考2.6小节
struct 用于定义抽象数据类型,参考2.5小节
break、case、continue、for、fallthrough、else、if、switch、goto、default这些参考2.3流程介绍里面
chan用于channel通信
type用于声明自定义类型
map用于声明map类型数据
range用于读取slice、map、channel数据
上面这二十五个关键字记住了,那么Go你也已经差很少学会了。
整体来讲这章写的挺不错的,注释最后涉及到线程和协程时有点懵逼,对这方面接触仍是少的缘由。