数据类型

说明最开始我们只需要关注基础类型即可

基础类型:数字,字符串,布尔类型

数字类型包括

变量/常量声明

//比较完整的方式
var a string = "hello go"
var a bool = true
var a int = 12
const PI int = 3.14
//我们尽量简短,所以我们更加推荐下边的写法
a:=32
var a = "hello go"
var a = true
var a = 12
const PI = 3.14

运算符

算术运算 :

运算符

说明

+ - * /

加减乘除

%

取余

++/–

自增

关系运算:

运算符

说明

> < >= <=

大小比较

!=

不等于

==

值的比较

逻辑运算

运算符

说明

&&


||




位运算:

运算符

说明

&

加减乘除

|

取余

^

自增

>>

右移

<<

左移

条件循环

go语言的判断语句是不加括号的

if

if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}

switch

go语言的switch是匹配之后自动结束的

var grade string = "B"
var marks int = 90

switch marks {
case 90: grade = "A"
case 80: grade = "B"
case 50,60,70 : grade = "C"
default: grade = "D"
}

循环

go语言只有for循环,没有while,do while之类的

for init; condition; post { }


for condition { }


for { }

循环控制关键字

break  
continue
goto

容器

go的容器包含数组,切片,map

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

var slice1 []type = make([]type, len)

也可以简写为

slice1 := make([]type, len)


countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}

函数定义

func function_name( [parameter list] ) [return_types] {
函数体
}

面向对象

type Books struct {
title string
author string
subject string
book_id int
}


func main() {

// 创建一个新的结构体
fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})

// 也可以使用 key => value 格式
fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})

// 忽略的字段为 0 或 空
fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})
}

接口

type Animal interface {
call()
}

type Frog struct {
}

func (frog Frog) call() {
fmt.Println("gua gua gua")
}

type Cuckoo struct {
}

func (cuckoo Cuckoo) call() {
fmt.Println("布谷 布谷")
}

func main() {
var animal Animal

phone = new(Frog)
phone.call()

phone = new(Cuckoo)
phone.call()
}

错误处理

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。

error类型是一个接口类型,这是它的定义:

type error interface {
Error() string
}
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
}
// 实现
}
result, err:= Sqrt(-1)

if err != nil {
fmt.Println(err)
}

模块化

  • ​1.5​​​ 版本之前的 ​​go​​​,​​go get​​​ 命令会将包会下载到 ​​GOPATH​​ 路径中
  • ​1.5​​ 及以上版本,添加了 依赖的组织名
  • ​vgo​​ 被提议作为 Go 模块支持的原型
  • Go 1.11 (beta) 版本中,​​vgo​​​ 被合并到主干代码并改进为 ​​go mod​​ ( 实验性质 )

在项目中使用

在一个空的文件夹中,使用​​go mod init​​初始化生成 go.mod 文件。

go.mod 文件一旦创建后,它的内容将会被 go toolchain 全面掌控,go toolchain 会在各类命令执行时,比如​​go get​​​、​​go build​​​、​​go mod​​等修改和维护 go.mod 文件。

go.mod 提供了 module、require、replace 和 exclude 四个命令:

  • module 语句指定包的名字(路径);
  • require 语句指定的依赖项模块;
  • replace 语句可以替换依赖项模块;
  • exclude 语句可以忽略依赖项模块。

新建main文件

package main

import (
"net/http"
"github.com/labstack/echo"
)

func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
}

改造项目

├─ main.go

└─ api
└─ apis.go
package main

import (
api "hello/api" // 这里使用的是绝对对路径
"github.com/labstack/echo"
)

func main() {
e := echo.New()
e.GET("/", api.HelloWorld)
e.Logger.Fatal(e.Start(":1323"))
}
package api

import (
"net/http"

"github.com/labstack/echo"
)

func HelloWorld(c echo.Context) error {
return c.JSON(http.StatusOK, "hello world")
}