go - lang 简介、安装、基础语法、流程控制、函数

一 go 语言介绍

1 认识go 

  •  go语言(或 Golang)是Google在 2007 年开发的一种开源编程语言,于2009年11月开源,2012年发布go稳定版
  •  go是非常年轻的一门语言,它的主要目标是“兼具Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性”

2 go 的诞生

l  Robert:曾协助制作Java的HotSport编译器,制作了chrome浏览器的js引擎V8

l  Rob:google首席科学家,与ken共事多年,创出广泛实用的UTF-8编码

l  Ken:1966年加入贝尔实验室,1983年图灵奖和美国国家技术奖得主,是Unix的原创者,发明了衍生出C和B语言

 

3 go 的优势

  •   做高并发有巨大的优势
  •   开发简单,开发效率堪比python
  •   运行效率高,很适合用作中央服务器的系统编程语言
  •   是项目转型的首选语言,很多公司在用go重构代码
  •   提供了海量并行的支持,很适合处理游戏相关数据

4 使用go的公司

    Google
    https://github.com/kubernetes/kubernetes
    Facebook
    https://github.com/facebookgo
    腾讯
    百度
    360开源日志系统
    https://github.com/Qihoo360/poseidon

 

 5 go适合做什么

  •   服务端开发
  •   分布式系统
  •   网络编程
  •   区块链开发
  •   内存KV数据库,例如boltDB、levelDB
  •   云平台,docker就是用go写的

 

二、环境安装

1.      下载SDK

  •  官网:https://golang.google.cn/
  •  go中文在线文档:https://studygolang.com/pkgdoc

 

2.      安装和配置SDK

  •   windows使用.msi一键安装
  •   配置环境变量
    •   GOROOT,自动的,默认将go安装到C:/go
    •   GOPATH,自定义的位置,理解为存放go代码的位置

 

新增系统环境变量

 

  •  创建并配置好GOPATH后,GOPATH目录还要创建3个子目录

 

3  SDK目录介绍

 

4  安装开发工具

  安装,双击安装

 

 

 

破解文件替换---》 将.jar文件复制到工具安装的bin目录下

 

  用记事本打开“goland.exe.vmoptions”和“goland64.exe.vmoptions”这两个文件,在后面添加破解文件的路径

 

  打开开发工具

 

找寻破解码,拷贝进去

 

 

 

三 第一个GO 程序

1 编写go源文件

package main

import "fmt"

func main(){
    fmt.Println("Go Lang,去浪吧,骚年!")
}

 

结果为

 

2   代码分析

// go单行注释,与java和C++一样
/*
   多行注释
*/
//每个go源代码开头是package声明,表示所属的包
//main代表可编译成二进制文件
package main

//导入格式化包,不用时会报错
import "fmt"

//main()主函数入口,不能带参数,不能定义返回值
//func声明函数的关键字
//前边大括号不能单起一行
func main() {
   fmt.Println("Go Lang,去浪吧,骚年!")
}

 

 

3 IDE 编写

特点:自动导包,没有引用的包,会自动删掉。

 

四  基础语法

1 命名

  •  go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则
  •   一个名字必须以一个字母或下划线开头,后面可以跟任意数量的字母、数字或下划线
  •  go区分大小写,hello Hello不同
  •   go语言中有25个关键字,不能用于自定义名字
break        default          func           interface         select
case         defer            go             map               struct
chan         else             goto           package           switch
const        fallthrough      if             range             type
continue     for              import         return            var
  •   还有30多个预定义的名字,用于内建的常量、类型和函数
内建常量:
    true false iota nil
内建类型:
    int int8 int16 int32 int64
    uint uint8 uint16 uint32 uint64 uintptr
    float32 float64 complex128 complex64
    bool byte rune string error
内建函数:
    make len cap new append copy close delete
    complex real imag
    panic recover

 

 

2 变量

  •   变量声明

 

  •   变量初始化

 

  •   变量赋值

 

  •   匿名变量

    _代表特殊的变量名,作用是占位,不用于输出和打印

 

3   常量与枚举

  •  声明常量
  •  iota常量生成器
  •  枚举类型
package main

import "fmt"

// const:声明常量
const filename = "abcd.txt"

func consts() {
   const (
      filename = "abc.txt"
      a, b     = 3, 4
   )
   //就近原则
   fmt.Println(filename)
}

//定义枚举类
func enums() {
   const (
      python = 0
      golang = 1
      java   = 2
   )
   fmt.Println(python, golang, java)
}

//iota生成器
func enums2() {
   const (
      python = iota
      golang
      java
   )
   fmt.Println(python, golang, java)
}

//iota参与运算
func enums3() {
   const (
      // 1 << 0
      // 1 * 2^0
      b  = 1 << (10 * iota)
      kb
      mb
      gb
      tb
      pb
   )
   fmt.Println(b, kb, mb, gb, tb, pb)
}

func main() {
   enums3()
}

 

 

 4 基本数据类型

  •  带u是无符号
  •  byte short int long

 

  •   整型

 

  • 浮点型

 

  • 布尔型

 

  • byte字符型

 

  • 字符串

 

 

5   fmt包的使用

  •  格式说明

 

  •  输出

  • 输入 Scan

 

 

6  类型别名

 

7  类型转换

  •  go 必须显示转换

 

8  运算符

  •   算术运算符

 

 

  •   关系运算符

 

 

  •   逻辑运算符(与,或,非)

 

五 流程控制

1 选择结构

  •   if else语句
package main

import (
   "io/ioutil"
   "fmt"
)

func main() {
   const filename = "abc.txt"
   //读文件
   contents, err := ioutil.ReadFile(filename)
   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Printf("%s\n", contents)
   }

   // if也支持如下写法
   if contents, err := ioutil.ReadFile(filename); err != nil {
      fmt.Println(err)
   } else {
      fmt.Printf("%s\n", contents)
   }
}

 

  • switch 语句
    •  每一个的等级自动break
    •    如果想要程序执行到下一个等级,使用 ` fallthrough `
package main

import "fmt"

//传入成绩,返回评分等级
func grade(score int) string {
   // 定义字符串
   g := ""
   // go语言switch自动每一句加了break
   switch {
   case score < 0 || score > 100:
      g = "输入错误"
   case score < 60:
      g = "F"
      fallthrough
   case score < 80:
      g = "C"
   case score < 90:
      g = "B"
   case score <= 100:
      g = "A"
   }
default:   XXX
   return g
}
//F F C B A A 输入错误
func main() {
   fmt.Println(
      grade(0),
      grade(59),
      grade(60),
      grade(82),
      grade(99),
      grade(100),
      grade(-3),
   )
}

 

 

 

2 循环结构

  • for
package main

import (
   "fmt"
   "time"
)

// 死循环
func for1() {
   //写法简单
   for {
      fmt.Println("日耳曼战车凉凉")
      // 睡1秒
      time.Sleep(1 * time.Second)
   }
}

//有次数的循环
func for2() {
   for i := 1; i < 11; i++ {
      fmt.Println("日耳曼战车凉凉", i)
      //睡500毫秒
      time.Sleep(500 * time.Millisecond)
   }
}

//有次数的循环
func for3() {
   for i := 1; i < 11; i++ {
      if i%5 == 0 {
         fmt.Println("爱阿根廷")
      } else if i%2 == 1 {
         fmt.Println("更爱战车")
      } else {
         fmt.Println("更爱是天台")
      }
      time.Sleep(500 * time.Millisecond)
   }
}

func main() {
   for3()
}

 

 

  • range
    •   用于遍历可迭代对象
package main

import "fmt"

func main() {
   s := "abc"
   //接收下标,通过下标取值
   for i := range s {
      fmt.Printf("下标=%d,值=%c\n", i, s[i])
   }
   //直接都接收到
   for i, c := range s {
      fmt.Printf("下标=%d,值=%c\n", i, c)
   }

   for _, c := range s {
      fmt.Printf("值=%c\n", c)
   }
}

 

 

3 调转语句

  •   break和continue

 

  •    goto  

    跳转到标识符语句位置。

    跳转后不会返回到原语句。

 

六 函数

1 自定义函数

  •   函数声明格式:
  •   方法名首字母大写是public,方法名首字母小写是private
func 函数名( [参数列表] ) [返回值列表] {
   函数体
}

 

  •  无参无返回值

 

  • 有参数无返回值

 

  •  有不定参数无返回值

 

 

  •   无参有返回值

 

  •    有参有返回值

 

  •   练习:分别通过循环和递归函数,计算1+2+3……+100
package main

import "fmt"

// 循环实现1到100累加
func Test01() int {
   sum := 0
   for i := 1; i <= 100; i++ {
      sum += i
   }
   return sum
}

//递归实现
//传100
func Test02(num int) int {
   if num == 1 {
      return 1
   }
   return num + Test02(num-1)
}

func main() {
   fmt.Println(Test01())
   fmt.Println(Test02(100))
}

 

 

2   defer关键字

  •   defer⽤于延迟一个函数或者方法的执行
  •   defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁
  •   通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放
  •   释放资源的defer应该直接跟在请求资源的语句后,以免忘记释放资源

 

3 多个defer 执行顺序(栈)

package main

import "fmt"

func test(x int) {
   fmt.Println(100 / x)
}

func main() {
   //defer是延迟操作
   defer fmt.Println("aaaa")
   defer fmt.Println("bbbb")
   //报错并不影响程序运行
   defer test(0)
   defer fmt.Println("cccc")
}

 

 

 

posted @ 2019-05-02 18:21  柳帅  阅读(1495)  评论(0编辑  收藏  举报
//替换成自己路径的js文件