【Go编程基础】13-反射reflection
反射reflection 反射可大大提高程序的灵活性,使得 interface{} 有更大的发挥余地 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字段本质) 想要利用反射修改对象状态,前提是 interface.data 是 settable,即 pointer-interface 通过反射可以“动态”调用方法  1234567891011121314151617181920212223242526272829303132333435363738394041424344454647type User struct {	Id int	Name string	Age int}func (u User) Hello() {	fmt.Println("Hello world.")}func main() {	u := User{1, "OK", 18}	Info(u)}func Info(o...
【Go编程基础】12-接口interface
接口interface 接口是一个或多个方法签名的集合 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示 声明实现了哪个接口,这称为 Structural Typing 接口只有方法声明,没有实现,没有数据字段 接口可以匿名嵌入其它接口,或嵌入到结构中 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个 复制品的指针,既无法修改复制品的状态,也无法获取指针 只有当接口存储的类型和对象都为nil时,接口才等于nil 接口调用不会做receiver的自动转换 接口同样支持匿名字段方法 接口也可实现类似OOP中的多态 空接口可以作为任何类型数据的容器  1234567891011121314151617181920212223242526272829303132333435363738394041424344454647type USB interface {	Name() string	// 嵌入接口	Connecter}type Connecter interface {	Connect()}type...
【Go编程基础】11-方法method
方法method Go 中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的组合 只能为同一个包中的类型定义方法 Receiver 可以是类型的值或者指针 不存在方法重载 可以使用值或指针来调用方法,编译器会自动完成转换 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是 方法所接收的第1个参数(Method Value vs. Method Expression) 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法 类型别名不会拥有底层类型所附带的方法 方法可以调用结构中的非公开字段  12345678910111213141516171819202122232425262728293031323334type A struct {	Name string}type B struct {	Name string}func main() {	a := A{}	a.Print()	b :=...
【Go编程基础】10-结构struct
结构struct Go 中的struct与C中的struct非常相似,并且Go没有class 使用 type  struct{} 定义结构,名称遵循可见性规则 支持指向自身的指针类型成员 支持匿名结构,可用作成员或定义成员变量 匿名结构也可以用于map的值 可以使用字面值对结构进行初始化 允许直接通过指针来读写结构成员 相同类型的成员可进行直接拷贝赋值 支持 == 与 !=比较运算符,但不支持 > 或 < 支持匿名字段,本质上是定义了以某个类型名为名称的字段 嵌入结构作为匿名字段看起来像继承,但不是继承 可以使用匿名字段指针  1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253// 结构是一个值类型type person struct {	Name string	Age int}func main() {	a := person{}	a.Name...
【Go编程基础】09-函数function
函数function Go 函数 不支持 嵌套、重载和默认参数 但支持以下特性:   无需声明原型、不定长度变参、多返回值、命名返回值参数   匿名函数、闭包   定义函数使用关键字 func,且左大括号不能另起一行 函数也可以作为一种类型使用  1234567891011121314151617181920package mainimport "fmt"func main() {	fmt.Println(A())	fmt.Println(B())}// 非匿名返回值,a,b,c不需要定义可直接赋值func A() (a, b, c int) {	a, b, c = 1, 2, 3	return}// 匿名返回值,return后面需要指定变量名称func B() (int, int, int) {	a, b, c := 4, 5, 6	return a, b,...
【Go编程基础】08-map
map 类似其它语言中的哈希表或者字典,以key-value形式存储数据  Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice  Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍_ Map使用make()创建,支持 := 这种简写方式  make([keyType]valueType, cap),cap表示容量,可省略  超出容量时会自动扩容,但尽量提供一个合理的初始值  使用len()获取元素个数  键值对不存在时自动添加,使用delete()删除某键值对  使用 for range 对map和slice进行迭代操作   1234567891011func main() {	m := make(map[int]string)	m[1]="OK"	a := m[1]	fmt.Println(a)	fmt.Println(m)}输出:OKmap[1:OK]  1234567891011121314151617181920212223func main()...
【Go编程基础】07-切片slice
切片Slice 其本身并不是数组,它指向底层的数组  作为变长数组的替代方案,可以关联底层数组的局部或全部  为引用类型  可以直接创建或从底层数组获取生成  使用len()获取元素个数,cap()获取容量  一般使用make()创建  如果多个slice指向相同底层数组,其中一个的值改变会影响全部  make([]T, len, cap)  其中cap可以省略,则和len的值相同  len表示存数的元素个数,cap表示容量   1234567891011121314151617181920212223242526272829func main() {	var s1 []int	fmt.Println(s1)	a := [10]int{1,2,3,4,5,6,7,8,9,10}	s2 := a[9]	fmt.Println(s2)	s3 := a[5:10]	fmt.Println(s3)	// 获取数组某个位置开始到结束	s4 := a[3:len(a)]	s5 :=...
【Go编程基础】06-数组array
数组Array 定义数组的格式:var  [n],n>=0 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型 注意区分指向数组的指针和指针数组 数组在Go中为值类型 数组之间可以使用==或!=进行比较,但不可以使用<或> 可以使用new来创建数组,此方法返回一个指向数组的指针 Go支持多维数组  12345678910111213// 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型var a [3]intvar b [2]intb = a// 上面的赋值语句会报错:cannot use a (variable of type [3]int) as type [2]int in assignment// 下面的语句就能正常赋值成功var a [2]intvar b [2]intb = afmt.Println(b)输出:[0...
【Go编程基础】05-控制语句
指针 Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不支持指针运算以及”->”运算符,而直接采用”.”选择符来操作指针 目标对象的成员 操作符”&”取变量地址,使用”*”通过指针间接访问目标对象 默认值为 nil 而非 NULL  递增递减语句 在Go当中,++ 与 – 是作为语句而并不是作为表达式  判断语句if 条件表达式没有括号 支持一个初始化表达式(可以是并行方式) 左大括号必须和条件语句或else在同一行 支持单行模式 初始化语句中的变量为block级别,同时隐藏外部同名变量  1234567891011121314func main()  {	a := true	if a, b, c := 2, 3, 4; a+b+c > 6 {		fmt.Println("大于6")	} else...
【Go编程基础】04-常量与运算符
常量的定义 常量的值在编译时就已经确定   常量的定义格式与变量基本相同   等号右侧必须是常量或者常量表达式 常量表达式中的函数必须是内置函数  123456789101112131415161718192021222324252627package mainimport "fmt"// 定义单个常量const a int = 1const b = 'B'const (	text = "123"	length = len(text)	num = b * 20)// 同时定义多个变量const i, j, k = 1, "2", '3'const (	text2, length2, num2 = "468", len(text2), k * 10)func main()  {	fmt.Println(a, b, text, length, num)	fmt.Println(i, j, k, text2, length2,...





