const 修饰,代表永远是只读的,不能被修改
常量的定义 以及强制类型转换
const filename = "abc.txt"
const 数值可作为各种类型使用
函数时编程
如何把 4,5 转换成5,4
main(){
fist =100
maix = 200
fist,maix = maix,fist
}
变量的作用域
1,在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部
2,在函数外部声明的变量叫做全局变量,生命周期作用于整个包,如果是大写的则作用于整个程序
int 8 一个字节 int16 俩字节 int32 四个字节 int64 八个字节
uint 无符号整形
生成随机数
matn/rand
rand.Int()
字符类型: var a byte 8位一个字节
字符串类型:var str string
占位符
%v 相应值的默认格式
%#v 响应值的go语法表示
%T 相应值的类型的Go语法表示
%% 字符上的百分号,并非占位符
%t 单词true或false
整数
%b 二进制表示
%c 相应Unicode码点所表示的字符
%d 十进制表示
%o 八进制表示
%q 单引号围绕的字符字面值,由go语法安全地转义
%x 十六进制表示,字母形式为小写 a-f
%X 十六进制表示,字母形式为大写A-F
%U Unicode格式
浮点数
%b 无小数部分的
%f 有小数点而无指数
字符串与字节切片
%s 字符串或切片
%q 双引号围绕的字符串
%x 十六进制,小写字母,每个字节俩个字符
%X 十六进制,大写字母,每个字节俩个字符
//字符串翻转
func reverse(str string) string{
var result string
strLen :=len(str)
for i := 0; i<strLen; i++{
result =result+fmt.Sprintf("%c",str[strLen-i-1])
}
return result
}
func main(){
var str1 ="hello"
result :=reverse(str1)
fmt.Println(result)
}
fmt.Scanf("%d",&n)
获取控制台输出
//水仙花
func isNumber(n int) bool{
var i,j,k int
i = n % 10
j = (n/10)%10
k = (n/100) %10
sum := iii + jjj + kkk
return sum == n
}
func main(){
var n int = 100
var m int =999
for i := n; i <m; i++{
if isNumber(i) == true{
fmt.Println(i)
}
}
}
strings 和strconv
strings.HasPrefix(s string,prefix string) bool 判断字符串s是否以prefix开头
stirngs.HasSuffix(s string,suffix string) bool, 判断字符串s是否以suffix结尾
strings.Index(s string,str string) int 判断str在s中首次出现的位置,如果没有出现则返回-1
strings.LastIndex(s string,str string) int 判断str在s中最后出现的位置,如果没有出现,则返回1
string.Replace(str string, old string,new string,n int),字符串替换
strings.Count(str string,substr string)int 字符串计数
strings.Repeat(str string,count int) string 重复count次str
strings.ToLower(str string) string:转为小写
strings.ToUpper(str string) string 转为大写
时间和日期类型
time包
time.Time类型,用来表示时间
获取当前时间 now :=time.Now()
time.Now().Day() ,time.Now().Minute(),time.Now().Month(),time.Now().Year()
指正的类型
普通类型,变量存的就是值,也叫值类型
获取变量的地址,用&,比如 var a int ,获取a的地址:&a
指针类型,变量存的是一个地址,这个地址存的才是值
获取指针类型所指向的值,使用:* 比如var p int 使用p获取p指向的值
goto 类似于for循环
label1
如果j == 4 就直接结束当前for循环执行父类
func main(){
LABEL1:
for i := 0;i <=5 ;i++ {
for j := 0;j<=5;j++{
if j ==4 {
continue LABEL1
}
fmt.Println("i is:%d,and j is:%d\n",i,j)
}
}
}
函数
声明语法:func 函数名(参数列表)[(返回值列表)]
golang 函数的特点
不支持重载,一个包不能有个俩个名字一样的函数
函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
匿名函数
多返回值
//可变参数
func add(a int, arg ...int)int {
var sum int = a
for i :=0; i<len(arg);i++{
sum +=arg[i]
}
return sum
}
func main(){
sum :=add(10,3)
fmt.Println(sum)
}
//可变参数字符串拼接
func add(a string, arg ...string)(result string) {
result = a
for i :=0; i<len(arg); i++{
result += arg[i]
}
return
}
func main(){
sum :=add("hello","word")
fmt.Println(sum)
}
函数
defer用途:
当函数返回时,执行defer语句,因此可以用来做资源清理
多个defer语句,按先进后出的方式执行
defer语句中的变量,在defer声明时就觉定了
for i :=0;i<10;i++{
defer
fmt.Println(i)
}
打印10 9 8。。。。1
defer用途 锁资源释放
func read(){
mc.LockI()
defer mc.Unlock()
}
数据库连接的释放
func read(){
conn :=openDatabase()
defe conn.Close()
}
内置函数
close:主要用来关闭channel
len:用来求长度,比如string,array,skice,map,channel
new 用来分配内存,主要用来分配值类型,比如int,struct,返回的是指针
make:用来分配内存,主要用来分配引用类型,比如chan,map,slice
append:用来追究元素到数组,slice中
panic和recover;用来做错误处理
//斐波那契数
func fab(n int) int{
if n <=1 {
return 1
}
return fab(n-1) +fab(n-2)
}
func main(){
for i := 0; i<10;i++{
n:=fab(i)
fmt.Println(n)
}
}
数组:是同一种数据类型的固定长度的序列
切片:切片是数组的一个引用,因此切片是引用类型
切片的长度可以改变,切片是一个可变的数组
通过make来创建切片
切片拷贝
s1 := [] int(1,2,3,4,5)
s2 :=make([]int,10)
copy(s2,s1)
切片
s3 :=[]int{1,2,3}
s3 = append(s3,s2 ...)
排序操作 使用sort包 import("sort")
sort.Ints 对整数进行排序
func testIntSort(){
var a = [...]int{1,8,38,2,144}
sort.Ints(a[:])
fmt.Println(a)
}
sort.Strings 对字符串进行排序,
sort.Float64 对浮点型进行排序
map 数据结构
ket -value 的数据结构,又叫做字典或者关联数组
map 数据结构
map排序
a.先获取所有key,把key进行排序
b.按照排序好的key,进行遍历
线程同步
impoty("sync")
互斥锁,var mu sync.Mutex
读写锁 var mu sync.RWMutex
写多的时候加互斥 读多的时候加读写锁