Go语言既可以到达静态编译语言的安全和性能,又可以高效开发。
1、从C语言继承了很多理念,包括表达式的语法、控制结构、基础数据类型、参数传值、指针等。
2、引入了包的概念,GO的一个文件都要归属一个包
3、垃圾回收机制,内存自动回收
4、天然并发(利用goruntine,实现大并发处理,高效利用多核)
5、吸收了管道通信机制,go特有的管道channel
6、函数可以返回多个值
7、新的创新,例如切片slice、延时执行defer等
Golang官网:https://go.dev
Golang中文API网站:https://studygolang.com/
编译
go build hello.go
运行
hello.exe
直接执行
go run hello.go
package main
//
import "fmt"
func main() {
fmt.Println("hello world")
}
注意事项
1、GO源文件以go结尾
2、Go应用程序的执行入口是main方法
3、Go语言严格区分大小写
4、Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现了Golang的简洁性
5、Go编译器是一行一行进行编译的,因此一行接卸一个语句,不可以多条语句写在同一行
6、Go语言定义的变量或者import的包,如果没有找到,代码不能编译通过
7、大括号都是成对出现的,缺一不可
package main
import (
"fmt"
"unsafe"
)
func main() {
printi()
fmt.Println("hello world")
}
//申请全局变量
var q1 = 1
var q2 = 1
var q3 = 1
var (
q11 = 1
q22 = 1
q33 = 1
)
func printi() {
//第一种定义变量 指定变量类型,声明后不赋值则用默认值
var name int = 1
//第二种自行判断 根据值自行判断变量类型
var num = 10.11
fmt.Println(unsafe.Sizeof(name))
//第三种 省略var 省略var,:=左侧的变量不应该是已经声明过的变量
age := 18
//使用变量
fmt.Println(name, num, age)
//多个变量申请
var n1, n2, n3 int
fmt.Println(n1, n2, n3)
//多个变量申请
var n11, n22, n33 = 1, 2, 3
fmt.Println(n11, n22, n33)
n111, n222, n333 := 1, 2, 3
fmt.Println(n111, n222, n333)
}
变量使用注意事项
1、变量表示内存的一个存储区域
2、该区域有自己的名称(变量名)和类型(数据类型)
3、Golang变量使用的三种方式
第一种,指定变量类型,声明后不赋值则用默认值
第二种,根据值自行判断变量类型
第三种,省略var,:=左侧的变量不应该是已经声明过的变量
4、多变量声明,一次性声明多个变量
5、该区域的数据值可以在同一类型范围内不断变化
6、变量在同一个作用域内不可以重名
7、变量=变量名+值+数据类型
8、Golang的变量如果没有赋初值,编译器会默认使用初值
在Go中函数以外的变量就是全局变量
基本数据类型
数值型
整数类型(int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte) 默认值0
uint无符号 int有符号
浮点类型(float32,float64) 默认值0
浮点数存放形式为符号位+指数位+尾数位
尾数部分可能丢失,造成精度损失
字符型(byte存单个字母字符)
如果我们保存的字符在ASCII表,则保存到byte
如果保存的字符的对应值大于255,可以考虑使用int类型保存
如果需要按照字符的方式输出,需要格式化输出%c
布尔型(bool) 默认值false
字符串(string) 使用的UTF-8编码 默认值""
字符串赋值了不可修改
双引号和反引号两种表示形式
反引号(``)将字符串的原生形式输出,不会进行转义
用加号实现字符串的拼接
派生/复杂数据类型
指针(pointer)
数组
结构体(struct)
管道(Channel)
函数(也是一种类型)
切片(slice)
接口(interface)
map
1、Golang整数类型分为有符号和无符号两种 大小与系统有关
2、Golang的类型默认为int类型
3、在程序中查看某个变量字节大小和数据大小
fmt.Println(unsafe.Sizeof(name))
4、Golang程序中整型变量在使用时采用保小不保大的原则,保证程序运行的情况下,尽量使用空间较少的数据类型
5、bit是计算机中最小的存储单位,byte是基础存储单元
Go在不同类型的变量之间赋值需要进行显示转换,不能自动转换
基本语法T(v) T是数据类型 v是要转换的数据 意思是将v转换为T类型
func transformdata() {
var i int32 = 100
var name = float32(i)
fmt.Print(name)
}
1、Go数据类型转换,可以从低精度转到高精度
2、被转换的是变量存储的数据,变量本身的数据类型没有发生变化
3、在转换中int64转int8不会报错但是会溢出,和我们预期的结果不一样
格式:
通用
%v 值的默认格式表示
%+v 类似%v但输出结构体会添加字段名
%#v 值的Go语法表示
%T 值的类型的Go语法表示
%% 百分号
布尔
%t 单词true或false
整数
%b 二进制
%c 对应的unicode码值
%d 十进制
%o 八进制
%q 对应单引号括起来的go语法字符值,必要时会采用安全的转义符表示
%x 十六进制 小写abc
%X 十六进制 大写ABC
%U unicode格式
浮点数与复数
%b 无小数部分、二进制指数的表示
%e 科学计数法 小写e
%E 科学计数法 大写E
%f 有小数部分但是无指数部分
%F 等价于%f
%g 根据实际情况采用%e或%f
%G 根据实际情况采用%E或%F
字符串
%s 直接输出字符串或字节数组
基本数据类型和string类型的转换
func transformString() {
var age int = 10
/*方法一
参数需要和表达式的类型匹配
函数会返回转换后的字符串*/
var string1 = fmt.Sprintf("%d", age)
fmt.Println(string1)
// 方法二 strconv函数 10代表小数保留的位数
var num1 int = 99
var str = strconv.FormatInt(int64(num1), 10)
fmt.Println(str)
// 方法三 Itoa函数将int转成string
var num2 int=123
str =strconv.Itoa(num2)
fmt.Println(str)
}
string数据类型 转基本数据类型
如果转换失败,则返回默认值
使用strconv包的函数进行转换
ParseBool(value bool,error)
ParseFloat()
ParseInt()
ParseUint()
func datatoString() {
var str string = "true"
var b bool
//1、strconv.ParseBool(str) 函数会返回两个值
//2、只想获取到value bool 不想获取err 所以用_忽略
b, _ = strconv.ParseBool(str)
fmt.Printf("%T %v", b, b)
var str1 string = "123"
var num1 int64
//第一个参数是字符串 第二个参数是十进制 第三个参数是位数
num1, _ = strconv.ParseInt(str1, 10, 64)
fmt.Printf("%d,%T", num1, num1)
var str2 string = "123.123"
var num2 float64
//第一个参数是字符串 第二个参数是十进制 第三个参数是位数
num2, _ = strconv.ParseFloat(str2, 64)
fmt.Printf("%d,%T", num2, num2)
}