Proverbs from @rob_pike's inspiring talk at Gopherfest SV 2015 (video)
Go:type关键词总结

Go:type关键词总结

type关键词总结

type 用法:

  • 定义结构体
  • 定义接口
  • 类型别名
  • 类型定义
  • 类型开关

类型定义和类型别名的区别:
区别就是类型定义是完全定义了一种新的类型,
而类型别名只是给现有的类型取了一个别名alias。(编译器会替换成基本类型。)

Read more
Go:package time

Go:package time

package time

time 转换注意事项

Go语言指定时间原点

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
"time"
"fmt"
)

func main() {
//当前时间格式化,记忆规律:创始年份2016 | 一 | 二 | 三(15时,即 3 pm) | 四 | 五
nowTime := time.Now().Format("2006-01-02 15:04:05")
fmt.Println(nowTime)
}
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