0%

2.数据类型

基本类型

整数

1
2
3
4
int8 int16 int32 int64 uint8 uint16 uint32 uint64 
int uint uintptr //内存大小不明确,uintptr确保足以存放指针
rune //int32同义词,用于存放Unicode码点
byte //int8同义词,强调语句未原始数据

浮点数

1
2
3
float32 float64
var a float64 = 1.12345678e-32 //支持科学记数法
+Inf -Inf NaN //三个特殊值 正无穷大,负无穷大,无意义结果

复数

1
2
3
4
complex64 complex128  //两者分别由float32 float64构成
var x complex128 = complex(1,2) //1+2i,使用内置的complex()函数构造附属,
a := real(x) //1,使用内置的real()函数获取实部
b := imag(x) //2,使用内置的imag()函数获取虚部

布尔

1
bool

字符串

  • 四个字符串处理包
    • strings:搜索、替换、比较、修整、切分与连接字符串
    • bytes:用于操作字节slice
    • strconv:类型转换,用于布尔值、整数、浮点数的相互
    • unicode:判别文字符号值特性
  • string 直接通过[]获取sliece,从而操作字符

指针

1
2
var a int
var p *int = &a
  • go的指针不能算术运算,即不能偏移
  • new():构造一个变量,并返回指针,p := new(int)var a int;var p *int = &a 并无差别

数组

1
2
3
var a [3]int 
var b [...]int = {1,2,3} //...表示,数组长度由初始化数组元素决定
var c [...]int = {99:1} //len(c)=100,指定位置初始化,其他位置默认初始化,可能会造成内存的浪费
  • 数组支持==,但前提是元素类型是可比较的
  • go的数组传递,是值传递

slice

1
2
3
var a [...]int = {1,2,3}	//底层数组 
var s []int = a[:] //slice的类型表示为"[]type"
var s []int = make([]int,3) //创建无名数组,并返回一个slice
  • slice是一种引用类型,需要底层数组作为支撑
  • 三个属性:指针,容量,长度,len()cap()分别返回长度与容量,引用若超过了容量,会宕机
  • slice唯一允许的比较操作是与nil比较,含义为是否有底层数组;检查slice是否为空使用的是len(s) == 0,不能使用s==nil
  • make([]T,len,cap)或者make([]T,len) :创建无名数组,并返回一个slice ,格式为
  • append([]T,T):在slice后面加元素,如果容量不足,则创建一个新的底层数组,用于存放slice
  • copy([]T,[]T):第一次目的,第二个源

map

1
2
//格式:map[K]V
var a map[string]int = make(map[string]int)
  • map使用引用类型,底层实现为散列表
  • delete(map,K):从map中删除元素
  • map设置元素前,必须初始化(make或者赋予初值)
  • map的元素不是一个变量,不可以对元素取地址
  • 与slice不同,map是不可以比较
  • go没有集合(set),可以用map[K]bool或者其他代替
  • map的key值类型,必须是可比较的类型

结构体

1
2
3
4
type Employee struct{
ID int
Name,Addr string //同类型可以写在同一行上
}
  • go中没有->,指针也是用.

  • 首字大写表示,变量可导出(public)

  • 出于效率考虑,大型的结构体建议用指针进行传递

  • 小写的成员变量,为内部变量,无法直接初始化

    1
    2
    type point struct{x,y int};
    p := point{1,2} //编译出错,x,y 不可访问
  • 成员初始化,不建议直接赋值,建议名称+值的方式初始

    1
    2
    3
    type Point struct{X,Y int};
    p := Point{1,2} //代码不易理解,且不方便扩展成员变量,不利于代码维护
    P := Point{X: 3,Y: 3} //建议使用这种方式初始化
  • 可比较性:如果成员均可以比较,该结构体可比较

  • 匿名成员与结构体嵌套的最主要意义在于:实现了面向对象中的继承

    1
    2
    3
    4
    5
    type Point struct{X,Y int};
    type Circle struct{
    Point
    Radius int
    }
  • 结构体与JSON的相互转换,依赖encodeing/json 包,通过反射实现

    • 结构体转JSON:json.Marshal([]T) string error

    • JSON转结构体:json.Unmarshal(string,*[]T) error

    • 成员标签定义:用于给成员进行重名命以及标识

      1
      Color bool `json:”color,omitempty”`