1. 前言

go的基础和大学学的C语言很像,有相关编译知识的,都是很好入门的。

2. go的特征

  • go文件名都是以 ".go"结尾的。
  • 主要声明方式:var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。
  • main函数,Go语言程序的默认入口函数(主函数):func main(){}
  • go命令
常用命令

go run :编译并运行命令源码文件。

go build :编译指定的源码文件或代码包以及它们的依赖包

go env :打印Go语言的环境信息

go get :下载或更新指定的包,并对它们进行编译和安装

go list :列出指定的代码包的信息。

go clean :删除掉执行其它命令时产生的一些文件和目录

go doc :打印附于Go语言程序实体上的文档。

go fix :把指定代码包的旧版本代码修正为新版本的代码。

go test :对Go语言编写的程序进行测试。

go vet :检查Go语言源码中静态错误的简单工具。

3. 基本结构和要素

下面是go程序输出 hello world 的程序

package main

import "fmt"

func main() {
    fmt.Println("hello, world")
}

可看出,package main 这个文件属于main包,这个main包是每个go程序都会包含的,有且仅有一个,所有的包名都是小写字母

上面fmt是Go 标准库中的包,需要引入需要import fmt即可,同时也可以import本地项目的文件包。

import "fmt"
import "os"

// import多个
import "fmt"; import "os"

// 简短方式
import(
   "fmt"
   "os"
)

import(
   "fmt"; "os"
)

如果包名是 ./ 开头的,会在go 相对路径去寻找;以/开头,则会在系统的决定路径寻找;其它的则会在go 全局文件寻找。 并且导入包即等同于包含了这个包的所有的代码对象。

3.1. go程序的基本结构

  • 对包import后,开始对常量和变量和类型定义进行声明

  • 有init函数,先对init函数进行定义或声明

  • 然后是当前文件包的定义

  • 最后定义其余的函数,首先是类型的方法,接着是按照 main 函数中先后调用的顺序来定义相关函数,如果有很多函数,则可以按照字母顺序来进行排序。

4. 常量

常量是不会改变的值,使用关键字 const 定义。

const a = 1
const b = 2

// 同时声明多个常量
const (
    a = 1
    b = 2
)

// 声明多个常量时,如果省略了值则和上面一行的值相同,常量啊,a,b,c的值都是1
const (
    a = 1
    b
    c
)

4.1. iota

常量可用作枚举,iota被用作枚举值

每当 iota 在新的一行被使用时,它的值都会自动加 1

const (
    a = iota  // 0
    b = iota  // 1
    c = iota  // 2
)

const (
    a = iota  // 0
    b =       // 1
    c =       // 2
)

// 使用_跳过某些值
const (
    a = iota // 0
    b        // 1
    _
    c        // 3
)

// iota声明中间插队
const (
    a = iota // 0
    b = 100  // 100
    c = iota // 2
    d        // 3
)
const e = iota // 0

5. 变量

变量的功能是存储数据。Go中的变量需要先声明后才能使用,同一作用域内不支持重复声明。并且变量声明后必须使用。

变量声明:var 变量名 变量类型

变量初始化:var 变量名 类型 = 表达式

var url string
var id int

// 批量声明变量
var (
    url string
    id int
)

// 初始化变量
var url string = "yzx-fjl.cn"
var id int = 1

// 初始化时也可以省略变量类型
var url = "yzx-fjl.cn"
var id = 1

// 一次初始化多个变量
var url, id = "yzx-fjl.cn", 1

// := 简短方式声明并初始化变量
url := "yzx-fjl.cn"
id := 1

5.1. 匿名变量

匿名变量用一个下划线_表示,用来忽略某个值

package main

import (
    "fmt"
)

// 全局变量
var url = "yzx-fjl.cn"

func getUrl() (string,bool) {
    id := "show" // 局部变量

    return url + "/" + id, true
}

func main() {
    url, _ := getUrl()
    fmt.Println(url)
}

下划线在import中也时常出现,如 import _ "github.com/go-sql-driver/mysql" import 加了_ 是不会把整个包都导入进来,它只是执行了包里的init()函数,所以是不可用过包名来调用包里其它函数。

6. 运算符

go语言内置的运算符有:

算术运算符

+ :相加

- :相减

* :相乘

/ :相除

% :求余

对于整数和浮点数,你可以使用一元运算符 ++(递增)和 --(递减),但只能用于后缀

关系运算符

== :判断两值是否相等

!= :判断两值是否不相等

'>' :判断左边值是否大于右边值

'>=' :判断左边值是否大于等于右边值

< :判断左边值是否小于右边值

<= :判断左边值是否小于等于右边值

以上判断返回bool类型,是返回 True,否返回 False

逻辑运算符

&& :两边都为true,返回true

ll :两边有一个为true,返回true

! :如果条件为true,返回false

以上判断返回bool类型

位运算符

'&' :两数各对应的二进位相与。(两位均为1才为1)

l :两数各对应的二进位相或。(两位有一个为1就为1)

^ :两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

'>>' :右移n位,左侧空白部分使用 0 填充;相当于除以2的n次方。

<< :左移n位,右侧空白部分使用 0 填充;相当于乘以2的n次方。

如:temp = 14 << 2,(14 二进制的 00001110)向左移两位等于 56 (即二进制的 00111000)。

a << n的值为 a*(2^n)。

赋值算符

= :简单的赋值运算符,将一个表达式的值赋给一个左值

'+=' :相加后再赋值

'-=' :相减后再赋值

'*=' :相乘后再赋值

'/=' :相除后再赋值

'%=' :求余后再赋值

'<<=' :左移后赋值

'>>=' :右移后赋值

'&=' :按位与后赋值

'l=' :按位或后赋值

'^=' :按位异或后赋值

7. 基本类型

Go 是强类型语言,不会进行隐式转换,任何不同类型之间的转换都必须显式说明

7.1. 布尔值

布尔型数据只有true和false两个值,默认值为false。需要注意的是它不允许整型强制转换为布尔型。布尔型也无法参与数值运算,也无法与其他类型进行转换。

7.2. 整型

整型可分为两个大类:

整数: int8、int16、int32、int64

无符号整数:

uint8、uint16、uint32、uint64

其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型,整型的零值为 0。

7.3. 浮点型

只支持两种浮点型数:float32和float64,浮点型的零值为 0.0

7.4. 复数

复数分为实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位

7.5. byte和rune类型

字符是只占用 1 个字节的传统 ASCII 编码的字符,按标准来讲,字符 byte 只是整数的特殊用例 uint8 的别名,字符使用单引号括起来。 另外当处理中文或其它复合字符时,会使用到rune类型来处理 Unicode,rune类型实际是一个int32,代表一个 UTF-8字符。

7.6. 字符串

字符串是 UTF-8 字符的一个序列,可将字符串看作是字节的定长数组,使用双引号括起来。

字符串转义符

\n 换行符 (直接跳到下一行的同列位置)

\r 回车符(返回行首)

\t tab符

\' 单引号

\" 双引号

\\ 反斜杠

定义多行字符串时,必须使用反引号`字符,反引号间的换行将被作为字符串中的换行,所有的转义字符均无效,文本将会原样输出。

字符串的常用操作

// 求长度

len(str)

// 拼接

+ 或 fmt.Sprintf

// 自定义分割符号对字符串分割

strings.Split(s, sep)

strings.Fields(s) (利用空白作为分隔符将字符串分割)

// 将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串

strings.Join(sl []string, sep string) string

// HasPrefix 判断字符串 s 是否以 prefix 开头:

strings.HasPrefix(s, prefix string) bool

// HasSuffix 判断字符串 s 是否以 suffix 结尾:

strings.HasSuffix(s, suffix string) bool

// Contains 判断字符串 s 是否包含 substr:

strings.Contains(s, substr string) bool

// 返回字符串 str 在字符串 s 中第一个出现位置的索引,返回 -1 表示不包含

strings.Index(s, str string) int

// 返回字符串 str 在字符串 s 中最后出现位置的索引,返回 -1 表示不包含

strings.LastIndex(s, str string) int

// 非 ASCII 编码的字符可使用下面定位

strings.IndexRune(s string, r rune) int

//字符串替换

strings.Replace(str, old, new, n) string

// 计算字符串 str 在字符串 s 中出现的非重叠次数

strings.Count(s, str string) int

// 重复 count 次字符串 s 并返回一个新的字符串(返回 count个s的新字符串)

strings.Repeat(s, count int) string

// 将字符串中的 Unicode 字符全部转换为相应的小写字符

strings.ToLower(s) string

// 字符串中的 Unicode 字符全部转换为相应的大写字符

strings.ToUpper(s) string

// 删除字符串开头和结尾的空白符号

strings.TrimSpace(s)

// 删除指定字符串开头结尾的字符 (只删除开头 TrimLeft,只删除结尾 TrimRight)

strings.Trim(s, "fan")

字符串与其它类型的转换

// 任何类型 T 转换为字符串总是成功的

// 返回数字 i 所表示的字符串类型的十进制数

strconv.Itoa(i int) string

// 将 64 位浮点型的数字转换为字符串,其中 fmt 表示格式(其值可以是 'b'、'e'、'f' 或 'g'), prec 表示精度,bitSize 则使用 32 表示 float32,用 64 表示 float64

strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string

// 字符串类型转换为数字类型

// 将字符串转换为 int 型

strconv.Atoi(s string) (i int, err error)

// 将字符串转换为 float64 型

strconv.ParseFloat(s string, bitSize int) (f float64, err error)

Copyright © yzx该文章修订时间: 2021-10-09 09:46:37

results matching ""

    No results matching ""