[TOC]数组
类型 | ⻓度 | 默认值 | 说明 |
---|---|---|---|
bool | 1 | false | 布尔型只有true和false |
byte | 1 | 0 | uint8的别名 |
rune | 4 | 0 | Unicode Code Point, int32别名 |
int, uint | 4 或 8 | 0 | 有符号和无符号证书,根据系统可能32 或 64 位 |
int8, uint8 | 1 | 0 | -128 ~ 127, 0 ~ 255 |
int16, uint16 | 2 | 0 | -32768 ~ 32767, 0 ~ 65535 |
int32, uint32 | 4 | 0 | -21亿 ~ 21 亿, 0 ~ 42 亿 |
int64, uint64 | 8 | 0 | |
float32 | 4 | 0.0 | 单精度浮点型 ,小数位:精确到7小数位 |
float64 | 8 | 0.0 | 双精度浮点型,小数位:精确到15小数位 |
complex64 | 8 | 负数 | |
complex128 | 16 | ||
uintptr | 4 或 8 | nil | ⾜以存储指针的 uint32 或 uint64 整数 |
array | 数组,值类型 | ||
struct | 结构体,值类型 | ||
string | "" | UTF-8 字符串 | |
slice | nil | 引⽤类型 | |
map | nil | 引⽤类型 | |
channel | nil | 引⽤类型 | |
interface | nil | 接⼝ | |
function | nil | 函数 | |
error | nil | 错误 |
函数 | 说明 |
---|---|
append | 追加元素到slice,返回修改后的slice |
close | 用来关闭channel |
delete | 从map中删除key对应的value |
panic | 用来作错误处理 panic和rcover |
recover | 容许程序定义goroutine的panic动做 |
imag | 返回complex的实部,(complex,real imag:操做复数) |
real | 返回complex的虚部 |
make | 用来分配内存,返回Type自己(只应用于slice,map,channel) |
new | 用来分配内存,主要用来分配值类型。返回指向Type的指针 |
cap | 用于求最大容量,好比array,slice,channel,返回最大容量 |
copy | 用于赋值和链接slice,返回复制的数目 |
len | 返回长度 |
print、println | 底层打印函数,通常用fmt包的打印 |
Go语言是静态类型语言,不能在运行期间改变变量类型。使用关键字 var 定义变量,自动初始化为零值。若是提供初始化值,可省略变量类型,由编译器自动推断。app
var x int //使用var var s = "abc" //省略类型 s:="abc" //函数内部能够省略var
var x, y, z int //定义多个 var s, n = "abc", 123 //定义多个省略类型 var ( //多个,多类型 a int b float32 ) //在函数内部,可⽤更简略的 ":=" ⽅式定义变量 a,b:=128,"12"
data, i := [3]int{0, 1, 2}, 0 i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
同一代码块,从新赋值内存地址不变。不一样代码块定义同名变量,内存地址不一样。函数
常量值必须是编译期可肯定的数字(整型、浮点型、复数)、字符串、布尔值ui
const s string = "Hello, World!" const s="Hello, World!"
const x, y int = 1, 2 // 多常量初始化 const ( // 常量组 a, b = 10, 100 c bool = false )
const ( s = "abc" x // x = "abc" )
const ( a = "abc" b = len(a) c = unsafe.Sizeof(b) )
const ( _ = iota // iota = 0 KB int64 = 1 << (10 * iota) // iota = 1 MB // 与 KB 表达式相同,但 iota = 2 ) const ( //在同⼀常量组中,能够提供多个 iota,它们各⾃增⻓。 A, B = iota, iota << 10 // 0, 0 << 10 C, D // 1, 1 << 10 ) //若是 iota ⾃增被打断,须显式恢复。 const ( A = iota // 0 B // 1 C = "c" // c D // c,与上⼀⾏相同。 E = iota // 4,显式恢复。注意计数包含了 C、 D 两⾏。 F // 5 )
Go语言支持指针类型*T
,指针的指针**T
,以及包含包名前缀的*package.T
。指针
var ip *int //声明一个int值的指针变量 var sp *string //生成string值的指针变量 var str="hello" sp:= &str //:=定义指针 var p **int //声明指针的指针
unsafe.Pointer类型用于表示任意类型的指针。有4个特殊的只能用于Pointer类型的操做:code
一、 任意类型的指针能够转换为一个Pointer类型值
二、 一个Pointer类型值能够转换为任意类型的指针
三、 一个uintptr类型值能够转换为一个Pointer类型值
四、 一个Pointer类型值能够转换为一个uintptr类型值对象
func main() { d := struct { s string x int }{"abc", 100} p := uintptr(unsafe.Pointer(&d)) // *struct -> Pointer -> uintptr p += unsafe.Offsetof(d.x) // uintptr + offset p2 := unsafe.Pointer(p) // uintptr -> Pointer px := (*int)(p2) // Pointer -> *int *px = 200 // d.x = 200 fmt.Printf("%#v\n", d) } //输出: struct { s string; x int }{s:"abc", x:200}
注意: GC 把 uintptr 当成普通整数对象,它⽆法阻⽌ "关联" 对象被回收。索引
字符串是不可变的值类型,内部用指针指向UTF-8字节数组。ip
在Go语言中,没有字符类型,字符类型是rune类型,rune是int32的别称。可以使用 []byte() 获取字节,使用 []rune() 获取字符,可对中文进行转换。内存
//“abc” 双引号定义字符串 `` 反引号定义非转义字符串,多行 str := `aaaa 能够跨行` str:="abc"
固然还有函数链接,这个放到字符串专题总结。如fmt.Sprintf() 等
单引号字符常量表⽰ Unicode Code Point,⽀持 uFFFF、 U7FFFFFFF、 xFF 格式。对应 rune 类型, UCS-4。
func main() { fmt.Printf("%T\n", 'a') var c1, c2 rune = '\u6211', '们' println(c1 == '我', string(c2) == "\xe4\xbb\xac") } //输出: int32 // rune 是 int32 的别名 true true
要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。⽆论哪一种转换,都会从新分配内存,并复制字节数组。
可将类型分为命名和未命名两⼤类。命名类型包括 bool、 int、 string 等,⽽ array、slice、 map 等和具体元素类型、⻓度等有关,属于未命名类型。
具备相同声明的未命名类型被视为同⼀类型。
使用type关键字自定义类型:
//可⽤ type 在全局或函数内定义新类型。 func main() { type bigint int64 var x bigint = 100 println(x) }
注意:新类型不是原类型的别名,除拥有相同数据存储结构外,它们之间没有任何关系,不会持有原类型任何信息。除⾮目标类型是未命名类型,不然必须显式转换。