zoukankan      html  css  js  c++  java
  • [go]a tutor of go语法

    go doc

    (walk through) overview of go

    .go源文件

    // main.go
    // 1. .go文件
    // 2. utf8编码
    
    package main //包名
    
    import "fmt"   //导入扩展包
    
    func main() {
        fmt.Println("hello 毛台")
    }
    
    $go run main.go
      
    hello 毛台
    

    变量

    func main() {
    	var x int
    	var s = "hello" //函数内可省略var关键字
    	fmt.Println(x, s)
    }
    //0 hello
    
    //函数内可省略var关键字
    func main() {
    	x := 100
    	fmt.Println(x)
    }
    //100
    

    表达式

    go有3种流程控制语句

    • if
    func main() {
    	x := -1
    	if x > 0 {
    		fmt.Println("x")
    	} else if x < 0 {
    		fmt.Println("-x")
    	} else {
    		fmt.Println("0")
    	}
    }
    
    //-x
    
    • switch
    func main() {
    	x := 0
    	switch {
    	case x > 0:
    		fmt.Println("x")
    	case x < 0:
    		fmt.Println("-x")
    	default:
    		fmt.Println(0)
    	}
    }
    
    //0
    
    func main() {
    	for i := 0; i < 5; i++ {
    		switch i {
    		case 0, 2: //任意命中1个即可
    			fmt.Println("even")
    			//命中这个分支后, 不需要写break,会被自动break
    		case 1, 3:
    			fmt.Println("odd")
    		default:
    			fmt.Println("it is not 0-3")
    		}
    	}
    }
    
    //even
    //odd
    //even
    //odd
    //it is not 0-3
    
    • for
    //正常的for循环
    func main() {
    	for i:=0;i<5 ;i++  {
    		fmt.Println(i)
    	}
    }
    //0
    //1
    //2
    //3
    //4
    
    //相当于while
    func main() {
    	i := 0
    	for i < 5 {
    		fmt.Println(i)
    		i++
    	}
    }
    
    //0
    //1
    //2
    //3
    //4
    
    //死循环
    for{
    	
    }
    
    // for range遍历返回索引
    func main(){
    	arr:=[]int{1,2,3}
    	for k,v := range arr {
    		fmt.Println(k,v)
    	}
    }
    

    函数

    //函数可返回多个值
    func div(a int, b int) (int, error) {
    	if b == 0 {
    		return 0, errors.New("b is 0")
    	}
    	return a / b, nil
    }
    
    func main() {
    	res,err:=div(10,0)
    	fmt.Println(res,err)
    }
    
    //函数是第一类型, 可作为参数或返回值(也可以赋值)
    func test(x int) func() {
    	return func() {
    		println(x)
    	}
    }
    
    //defer定义延迟调用, 无论函数是否panic,结束时都被执行
    func div(x, y int) {
    	defer println("div end...")
    	fmt.Println(x / y)
    }
    
    func main() {
    	div(10, 0)
    }
    
    //div end...
    //panic: runtime error: integer divide by zero
    

    数据

    //切片 - 类似动态数组
    func main() {
    	arr := make([]int, 0, 2)
    	for i := 0; i < 5; i++ {
    		arr = append(arr, i) //当容量不够时自动重新分配空间扩容
    	}
    	fmt.Println(arr)
    }
    
    //map
    func main() {
    	m := make(map[string]int)
    	m["a"] = 1         //增加/更新元素
    	ok, v := m["a"]    //判断是否存在
    	fmt.Println(ok, v) //判断存在:1 true
    	delete(m, "a")     //删除元素
    }
    

    方法

    type user struct {
    	name string
    	age  int
    }
    
    type manager struct {
    	user
    	title string
    }
    
    func main() {
    	var m manager
    	m.name = "mm"
    	m.age = 22
    	m.title = "CTO"
    	fmt.Println(m)
    }
    
    //{{mm 22} CTO}
    
    //可以调用父类方法, 实现类似继承的功能
    type user struct {
    	name string
    	age  int
    }
    
    func (u *user) toString() string {
    	return fmt.Sprintf("%v", u)
    }
    
    type manager struct {
    	user
    	title string
    }
    
    func main() {
    	var m manager
    	m.name = "mm"
    	m.age = 22
    	m.title = "CTO"
    	fmt.Println(m.toString())
    }
    
    //&{mm 22}
    
    //可以为任意类型绑定方法
    
    type X int
    
    func (x *X) incr() {
    	*x++
    }
    func main() {
    	var x X
    	x = 1
    	x.incr()
    	x.incr()
    	fmt.Println(x)
    }
    
    //3
    

    接口

    type user struct {
    	name string
    	age  int
    }
    
    func (u user) Say() {
    	fmt.Printf("%v", u)
    }
    
    type people interface {
    	Say()
    }
    
    func main() {
    	var u user
    	u.name = "mm"
    	u.age = 22
    
    	var p people
    	p = u
    	p.Say()
    }
    
    //空接口可以接受任意类型的值
    
    func test(x interface{}){
    	fmt.Println(x)
    }
    
    func main() {
    	test(10)
    	test("mm")
    }
    

    并发

    整个runtime并发设计, 几乎所有的进程都是以goroutine方式运行
    channel与goroutine搭配, 实现通信,替代传统的通过共享内存通信的csp(Communicating Sequential Processes)模型,

    // 消费者 
    func consumer(data chan int, done chan bool) {
    	for x := range data { // 接收数据,直到通道被关闭 
    		println("recv:", x)
    	}
    
    	done <- true // 通知main,消费结束 
    }
    
    // 生产者 
    func producer(data chan int) {
    	for i := 0; i < 4; i++ {
    		data <- i // 发送数据 
    	}
    
    	close(data) // 生产结束,关闭通道 
    }
    
    func main() {
    	done := make(chan bool) // 用于接收消费结束信号 
    	data := make(chan int)  // 数据管道 
    
    	go consumer(data, done) // 启动消费者 
    	go producer(data)       // 启动生产者 
    
    	<-done // 阻塞,直到消费者发回结束信号 
    }
    

    main函数

    • 每个程序只能又一个main函数,程序入口
    • main函数不支持return, 使用os.Exit返回状态
    //main不支持参数,传参使用os.Args
    func main() {
    	fmt.Println(os.Args)
    }
    
    //$: go run main.go 1 2 3
    //[/var/folders/4g/nfky9hks3j39qhvz741tmcn40000gn/T/go-build150967295/b001/exe/main 1 2 3]
    
    //main函数不支持返回值
    
    func main() int{
    	return 10
    }
    //$: go run main.go
    //# command-line-arguments
    //./main.go:3:6: func main must have no arguments and no return values
    
    //main函数返回状态值的方法: os.Exit
    func main() {
    	fmt.Println("hello")
    	os.Exit(-1)
    }
    //$: go run main.go
    //hello
    //exit status 255
    
  • 相关阅读:
    【MySQL】DBA必备的10款最佳MySQL GUI工具
    【MySQL】获取MySQL崩溃时的core file
    字符串经常用的
    centos 系统上如何把python升级为3
    centos6 升级安装openssh7
    多进程
    队列
    线程池,锁,事件
    thread
    进程、线程
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/12255110.html
Copyright © 2011-2022 走看看