Go:switch

Go:switch

switch

switch 注意事项

  • fallthrough 不能用在 switch 的最后一个分支。
Go:struct

Go:struct

struct

面向对象 Class 类的底层实现从某些方面说就是结构体,对象的引用就是指针,只是语言把他们封装起来了而已。

Golang 的 Struct 结构体(源于 C 语言,但又有别于 C)的灵活性:
go 语言中并没有像 C++,Java 语言中这类的 Class,它只含有像 C 语言中的结构体,用结构体和指针等特性,完成一个类的作用,很巧妙的使用了指针和结构体,不仅是 go 的面向对象,包括 go 语言中的 map 等操作都是借助了结构体。其实,说白了,C++、Java 等面向对象的语言中,类的底层实现就是结构体,对象的引用就是指针,只是语言把他们封装起来了而已。很多人刚接触面向对象很不理解这些东西也应该缘于此。

Read more
Go:关于 Go 语言:结构体(Struct)-方法(Method)-接收者(Receiver)类型的适用场景选择和命名约定(Go 官方建议)

Go:关于 Go 语言:结构体(Struct)-方法(Method)-接收者(Receiver)类型的适用场景选择和命名约定(Go 官方建议)

关于 Go 语言:结构体(Struct)-方法(Method)-接收者(Receiver)类型的适用场景选择和命名约定(Go 官方建议)

何时使用值类型场景

1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型)。
2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存给 slice,使用值类型。
3.如果接受者是一个小的数组或者原生的值类型结构体类型(比如 time.Time 类型),而且没有可修改的字段和指针,又或者接受者是一个简单地基本类型像是 int 和 string,使用值类型就好了。

Read more
Go:string

Go:string

string

常用拼接方法

  • += 来拼接
  • bytes.Buffer
  • strings.Builder ( >= go1.10 )
Read more
Go:slice 切片本质

Go:slice 切片本质

go 切片:本质

数组

Go 的切片是在数组之上的抽象数据类型,因此在了解切片之前必须要要理解数组。
数组类型由指定和长度和元素类型定义。
数组不需要显式的初始化;数组元素会自动初始化为零值:

Read more
Go:polymorphism

Go:polymorphism

polymorphism

多态特性

  • 多态:同一件事情由于条件不同产生的结果不同;
  • 由于 Go 语言中结构体不能相互转换,所以没有结构体类型的多态,只有基于接口的多态。
    这符合 Go 语言对面向对象的诠释;
Read more
Go:reflect 反射

Go:reflect 反射

reflect 反射

反射性能的一般原则

基准测试结果的数值分析的一般原则建议:

  • 能使用原生代码时,尽量避免反射操作。
  • 提前缓冲反射值对象,对性能有很大的帮助。
  • 避免反射函数调用,实在需要调用时,先提前缓冲函数参数列表,并且尽量少地使用返回值。
Read more
Go:pointer

Go:pointer

pointer 指针

基于指针对象的方法

当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。对应到我们这里用来更新接收器的对象的方法,当这个接受者变量本身比较大时,我们就可以用其指针而不是对象来声明方法,如下:

Read more
Go:null judge

Go:null judge

null judge

int 空值是 0,

string 空值是””而不是 null 或者 nil

Read more
Go:Map

Go:Map

Map 要点

注意事项

  • map 是引用类型的: 内存用 make 方法来分配。
  • new,永远用 make 来构造 map。new() 分配了一个引用对象,你会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取了它的地址。
  • 当 map 增长到容量上限的时候,如果再增加新的 key-value 对,map 的大小会自动加 1。所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。
Read more