1 // package main 和 main 函数 2 package main 3 func main() {} 4 5 //每一个.go文件都需要有 package 关键词,并且声明在文件顶部 6 package pkgName 7 8 // import 用来导入依赖包 9 import "name" 10 11 // 常量定义 - const NAME type = value 12 const NAME string = "xiaoming" 13 14 // 全局变量的定义 - var ... 15 var name string = "xiaohei" 16 17 // 一般类型声明(定义变量的类型) - type ... 18 type learn string 19 20 // 声明结构 21 type Learn struct { 22 // ... 23 } 24 25 // 声明接口 26 type Learn interface 27 28 // 函数的定义 29 func fn () {}
package
package是最基本的分发单位和工程管理中依赖关系的体现;
源文件开头需要声明package;
要生成可执行程序,要有package main 和 main函数;
同一个路径要只能有一个package
import
1 // 方式一 2 import "package1" 3 import "package2" 4 import "package3" 5 6 // 方式二 7 import ( 8 "package1" 9 "package2" 10 )
原理:
import 导入,是按顺序导入;
导入包中含有其他依赖包,会先导入依赖包,初始化其中的常量和变量,如果有init函数,还会执 行init();
所有包导入完成后,才会对main中和常量和变量进行初始化,如果main中有init函数,先执行init(),在执行main函数;
一个包被导入多次,但实际只会导入一次;
import _ "pkg" 会导入该包,但不会执行整个包,而是执行包中的init函数(简单点说,就是这样做会到时自动执行包的init(),注册包引擎,关于这个包就无需其他操作了);
import . "pkg" 可以不加包名,直接方法
别名用法:
import alias "pkg"
数据类型
1. 数值类型(整型、浮点型、复数、其他)、字符串类型、布尔类型
2. 派生类型
指针类型(Pointer)
数组类型
结构化类型(struct)
Channel类型 (chan)
函数类型(func)
切片类型(slice)
借口类型(interface)
Map类型(map)
3. 类型零值和类型别名
类型零值:变量被声明之后的默认值
不同类型的变量是不能进行运算的
unsafe包
unsafe 库让 golang 可以像C语言一样操作计算机内存(不推荐使用此包)
type ArbitraryType int
type Pointer *ArbitraryType
func Sizeof(x ArbitraryType) uintptr
func Offsetof(x ArbitraryType) uintptr
func Alignof(x ArbitraryType) uintptr
常量声明
// 显式 const name type = value // 隐式(无类型常量) const name = value // * 常量只支持数值、布尔、字符串类型
变量声明
// 单个声明 var name [type] = value // 多个声明 var a, b, c [type] = v1, v2, v3 //简写 a, b := v1, v2 // 分组声明 var ( a [type] b [type] c [type] )
全局变量必须使用var声明 | 特殊变量使用下划线
类型转换
// 类型转换必须是显示的 // 类型转换只能发生在两种兼容类型之间 var a = 1 var b float32 b = float32(a)
变量可见性规则
大写字母开头的变量是公有变量,可以被其他包读取
小写字母开头的变量是私有变量
流程语句
// if - else if a > 0 {} if a > 0 { } else { }
switch name { case v1: .. case v2: .. default: .. }
for init; condition; post {}
// 待续