GO语言随笔(一)
对比C/C++的不同语法。
Go中文网在线标准库文档:https://studygolang.com/pkgdoc
1.基础部分
1. GO语言特点
-
GO具有静态编语言的安全和性能,也具有动态语言维护的高效率;GO=C+Python
-
GO引入了包的概念,用于组织程序结构,GO语言的每一个文件都要归属于一个包,而不能单独存在;
-
GO有自己的垃圾回收机制,内存自动回收,弥补C/C++的缺点;
-
天然的并发(到此暂未看)重点;
(1). 从语言层面支持并发,实现简单;
(2). goroutine,轻量级线程,可实现大并发操作,高校利用多核;
(3). 基于CSP并发模型; -
函数可以返回多个值,类似python;
-
吸收了管道通信机制,形成GO语言特有的管道channel。
2.GO执行流程
- 先对源码编译,再执行流程。
- 对源码直接执行
3.GO语言注意事项
-
GO源文件以“go”为扩展名;
-
GO代码不需要“;”结尾;
-
Go语言定义的变量或者import的包如果没有使用到,则代码编译不会通过;
-
Go的注释,同C++
-
代码风格:"{"不可换行
此写法正确
func main{ //执行语言 }
此写法错误
func main { // 此”{“不可换行 //执行语言 }
-
Go的变量名、函数名、常量名 采用驼峰法,xxxYyyZzz
-
Go中没有 ++i 和 --i 的操作,且 i++ 和 i-- 智能单独使用。
4.变量
变量 = 数据类型 + 值 + 变量名
变量的三种使用方法:
-
指定变量类型,声明后不赋值,使用默认值;
var i int //此时i不赋值,则i使用默认值,int默认值为0
-
根据值自行判断类型(类型推导);
var d =10.11 //根据值10.11推断d为float类型
-
省略var ,用”:=“,意为声明并赋值;
i:=10 //声明变量i并赋值为10
补充:多变量声明
i,d,name:=1,10.11,"wjq" //同时声明三个变量并赋值
查看数据类型和所占内存大小
n := 10.11
fmt.Printf("类型 %T,占用内存大小%d",n,unsafe.sizeof(n))
// Printf() 格式化输出
// %T 类型输出,%d 大小输出
// unsafe.sizeof()
5.数据类型
GO的数据类型
数据类型补充点:
-
Go没有专门的字符类型(char),一般使用byte来代替,也可用int类型;
//例一: var c byte = ’a‘ fmt.Println(c) //输出’a‘的ASCII的码值 fmt.Printf("%c",c)//输出字符 a。格式化输出:Printf + %c
//例二 var c2 int ='中' //当字符的ASCII的码值>255,可考虑用int类型保存 fmt.Println(c) //输出’a‘的ASCII的码值 fmt.Printf("%c",c)//输出字符 a。格式化输出:Printf + %c
-
string类型说明
(1). 因Go中没有专门的字符类型,而字符串是一串固定长度连接起来的字符序列,所以Go的string是由字节组成的。
(2).字符串一旦赋值,字符串则不能修改;var str="hello" str[0]='a' //错误,不可修改
(3). 字符串拼接 ”+“
str:="hello" + "world" //str=hello world"
-
Go的编码统一使用UTF-8,所以不存在编码乱码的情况。
6.类型转换
(1). 基础类型转换
go的类型转换必须是显示转换,go中不存在类型的自动转换。其语法T(v),T为数据类型,v为值。
var i int32 = 100
var n1 float32 = float(i) //将i转为float32类型
(2). string转基本类型
strconv包的函数
注:此组函数返回值有两个(value ,error)
例:
var str string = "true"
var str string = "123"
var b bool
var n int
b,_ = strconv.ParseBool(str) // 此处只获取value
n,_ = strconv.ParseInt(str,10,64) // 10 十进制;64 位数
(3). 基本类型转string
方式一
func.Sprintf("%参数",表达式) //此函数根据参数生成格式化的字符串并返回该字符串。
例;
var num1 int = 90
var str string
str = fmt.Sprintf("d",num1) // 转换为string类型
方式二
strconv包函数
例:
var num1 int = 90
var str string
str = strconv.FormatInt(num1,10) //将num1转为string类型
7.指针 类似C/C++
8.分支结构 类似C/C++
if分支结构
// 结构一
if 条件表达式 { //此”{“必须在此行
//执行语句
}
//结构二
if 条件表达式{
//执行语句
}else{ // else{必须在此行
//执行语句
}
//结构三
if 条件表达式1{
//执行语句1
}else if 条件表达式2{
//执行语句2
}
......
else{
//执行语句n
}
switch分支结构
switch 表达式{
case 条件11,条件12,...:
//执行语句1
case 条件21,条件22,...:
//执行语句2
......
case 条件31,条件32,...:
//执行语句n
default:
//执行语句n+1
}
注:
-
Go的每个执行语句后,不用加break,不同于C/C++;
-
switch的穿透 fallthrough,默认只能穿透一次;
例:var num =10 switch num{ case 10: fmt.Println("l1") fallthrough case 20: fmt.Println("l2") fallthrough default: fmt.Println("other") }
9.循环结构
Go中只有for循环,while和 do while 结构可用while代替。
结构
(1) .结构一
for 循环变量初始化;循环条件;循环变量迭代{
//循环操作
}
for i:=0;i<10;i++{
fmt.Println("hello world")
}
(2).结构二 (似while)
for 循环条件 {
//循环操作
}
var i=0
for i<10{
fmt.Println("hello world")
i++
}
(3).死循环 (与break结合使用)
for {
//循环操作
}
(4).for-range方式
str := "hello"
for index,val != range str{
fmt.Printf("index=%d,value=%c",index,val)
}
10. 函数
基础语法
11.包
go是以包的形式来管理文件和项目目录结构的。
包的作用:
- 区分相同名字的函数、变量等标识符;
- 当程序文件很多时,可以很好的管理项目;
- 控制函数、变量等的作用域。
注:为了让其他包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似C/C++的public权限,才能实现跨包访问