引用自我的知乎 https://zhuanlan.zhihu.com/p/381467394
go (golang) 是google搞出来的编程语言,开发简单,执行效率高,相对于C,多了协程(轻量级线程),GC(自动垃圾回收),很多的的支持库,相对于Java,多了指针,相对于Python,嗯...效率高,体积小
go的基本格式
package main
import "fmt"
// 如果使用go run file.go 执行,必须有main(),且必须 package main
func main() {
fmt.Println("hello"); // 可以使用fmt包的函数,fmt.Println
println("World"); // 也可以直接使用println
}
还可以批量导包
import ( "fmt"
"ioUtil"
"hello"
"sync/atomic"
"github.com/ethereum/go-ethereum/common"
)
变量 : (go 变量类型 居然在后面)
Go语言的基本类型有:
bool
string
int、int8、int16、int32、int64
uint、uint8、uint16、uint32、uint64、uintptr
byte // uint8 的别名
rune // int32 的别名 代表一个 Unicode 码
float32、float64
complex64、complex128
var a int; // 定义变量,默认分配内存,默认值为0
var b, c int32;
var ( // 批量定义变量
a1 int
a2 int32
a3 float64
a4 string
a5 []int
a6 *int // int 指针类型,默认值nil
)
d := 10086; // 初始化并赋值,此时类型可省略,类型推导a = 0;b = 1;c = 2;
结构体
type Hello struct {
hiMsg string
count int
whoAreYou *string // string指针
}
类, go并不是面向对象的,所以也没有类的关键字,但有类似的封装可以实现类的功能
// 为结构体 Hello增加一个函数
func (h *Hello) sayHi() {
h.count ++;
fmt.Printf("%s,you id is %d",h.hiMsg,h.count);
}
func main() {
// 初始化Hello : 带参数
h := &Hello{
hiMsg: "hi",
count: 0
}
// 初始化Hello: 不带参数
// h := new(Hello);
h.sayHi();
}
普通函数
func sayHello(w string) int{
fmt.Printf("Hello:%s \r\n",w)
return 0;
}
// 多返回值函数
func swap(a,b int) (b,a int) {
return b,a;
}
func main() {
a:= 1;
b :=2;
a,b = swap(a,b); // a=2,b=1
// 丢弃标识符 '_'
//如 第二个返回值被丢弃
a,_ = swap(a,b);
}
匿名函数
func sayBye(w string) {
func (m string){
fmt.Printf("%s:inner:%s \r\n",w,m);
}("hi") // hi是调用时传入的参数m
}
延迟函数
defer xxx 是将xxx延迟执行,延迟到上级函数结束时执行,如下B函数执行结束时才会执行匿名函数和A函数
func A() {
fmt.Println("a");
}
func B() {
defer A();
fmt.Println("b");
defer func(){
fmt.Println("c");
}
}
//执行结果
b
c
a
协程
协程是轻量级线程,也叫纤程,适合于waitFor、等待监听等阻塞操作
func E() {
fmt.Println("e")
}
func main(){
go E();
go E();
}
循环
for a:=1; a<100; a++ {
fmt.Println(a)
}
for b := range(1,100) {
fmt.Println(b);
}
for { // while(true)
}
接口 interface
type SayHi interface {
Hi()
}
var A Integer;
func (A *Integer) Hi() { // 给A增加一个函数 Hi()
// 只需要实现接口定义的方法,不需要声明实现了哪些接口
}
func main() {
a := &A();
var s SayHi = new SayHi(a); // 接口实例化
s.Hi();
}
//接口继承
type SayHello interface {
SayHi
}
下载依赖库
go get http://github.com/xiaotd/xxx-go
读取文本文件
package demo
import ( "os"
"fmt"
"bufio"
)
func ReadFile(fileName string) {
if file, err := os.Open(fileName);err !=nil{ // 打开文件
panic(err) // 如果文件不存在,报错
}else {
scanner := bufio.NewScanner(file)
for scanner.Scan(){ // 一行一行读取
fmt.Println(scanner.Text())
}
}
}
func main() {
ReadFile("c:\\test.txt")
}