1. 前言
go的基础和大学学的C语言很像,有相关编译知识的,都是很好入门的。
2. go的特征
- go文件名都是以 ".go"结尾的。
- 主要声明方式:var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。
- main函数,Go语言程序的默认入口函数(主函数):func main(){}
- 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语言内置的运算符有:
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 字符的一个序列,可将字符串看作是字节的定长数组,使用双引号括起来。
定义多行字符串时,必须使用反引号`字符,反引号间的换行将被作为字符串中的换行,所有的转义字符均无效,文本将会原样输出。
// 求长度
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)