go 从入门到精通(二)基本数据类型和操作符

一、文件名&关键字&标识符

  • 所有go源码都是以.go结尾
  • 标识符以字母或下划线开头,大小写敏感
  • 下划线_是特殊标识符,用户忽略结果
  • 保留关键字
  • 导入包时可以设置别名

下面是保留关键字:

二、GO程序的基本结构

package mainimport ("fmt"
)func main(){fmt.Println("Hello world")
}

任何一个代码必须隶属一个包
import关键字,引入其他包
golang可执行程序,package main 并且只有一个main入口函数
包中函数的调用,同一个函数中可以直接调用;不同包中函数,通过包名+点+函数名进行调用
包访问控制规则,大写意味着这个函数或者变量可以导出的,及在其他包内是可以调用的;小写以为这个函数或者变量是私有的,包外部不能访问。

小练习1
写一个小程序,对于给定的一个数字n,求出所有两两相加等于n的组合

package mainimport ("fmt"
)func add_num(n int){for i:=0;i<=n;i++{fmt.Printf("%d+%d=%d\n",i,n-i,n)}
}func main(){add_num(5)
}

小练习2
写一个小程序,包含两个包,add和main,其中add包中有两个变量:Name,和age,请问main包中如何访问Name和age?(用于理解go中大小写敏感的问题)

main包中的代码:

package main
import ("fmt""go_dev/day02/kexia02/add"
)func main() {fmt.Println(add.Name)
}

add包中的代码

package add
var Name string = "zhaofan"
var age int = 23

从结果我们可以发现我们在main包中是不能调用到add包中的age,但是是可以调用到Name
这里就是因为大小写的问题,go中的大写可以理解为其他语言中的public,小写理解为private
这里有个问题需要注意:
我们把add包中的代码改为:

package add
var Name string
var Age intName = "zhaofan"
Age = 23

这样也是错误的写法,go作为编译型语言,必须通过函数来进行语句的执行,而不能在函数外执行语句

小练习3
开发一个小程序,使用包别名来访问包中的函数或变量
直接对上一个程序的main包进行更改

package mainimport ("fmt"a "go_dev/day02/kexia02/add"
)func main() {fmt.Println(a.Name)fmt.Println(a.Age)
}

小练习4
每个源文件都可以包含一个init函数,这个init函数自动被go运行框架调用,通过下面例子演示:

package mainimport ("fmt"
)func init(){fmt.Println("执行初始化函数")
}func main() {fmt.Println("hello world")
}

运行结果是先打印了init函数的内容,后打印了main函数中的问题,所以init函数先与main函数执行

三、函数的声明和注释

函数声明

格式为:func 函数名字(参数列表)(返回值列表)
例子如下:
func add(){
}

func add(a int,b int) int{
}
func add(a int,b int) (int int){
}

注释
单行注释//
多行注释/* */

四、GO语言的数据类型和操作符

常见数据类型及分类

GO语言按照类别分为几下几种数据类型:
布尔型:true或false,例子:var b bool = true
数字类型:包括整型int和浮点float
字符串类型:这里强调一下,GO的字符串是由单个字节连接起来的Go语言的字符串的字节使用UTF-8编码标识Unicode文本。
派生类型:这里包括指针类型,数组类型,结构化类型,Channel类型,函数类型,接口类型,Map类型

注意:
字符串的时候用双引号”“,这里也可以用反引号`,通过反引号的方式会保留你的格式,不会对你的内容做任何转义

字节的时候用单引号‘’,同样也可以通过反引号`

var cc byte = 'c' fmt.println(ccc)
var cc byte = c fmt.println(cc)
一个会打印c的ASCII,一个会打印c

关于fmt.Printf()的用法
官网地址:https://go-zh.org/pkg/fmt/

一般
%v 相应值的默认格式。在打印结构体时,“加号”标记(%+v)会添加字段名
%#v 相应值的Go语法表示
%T 相应值的类型的Go语法表示
%% 字面上的百分号,并非值的占位符布尔
%t 单词 true 或 false。整数
%b 二进制表示
%c 相应Unicode码点所表示的字符
%d 十进制表示
%o 八进制表示
%q 单引号围绕的字符字面值,由Go语法安全地转义
%x 十六进制表示,字母形式为小写 a-f
%X 十六进制表示,字母形式为大写 A-F
%U Unicode格式:U+1234,等同于 "U+%04X"浮点数及其复合构成
%b 无小数部分的,指数为二的幂的科学计数法,与 strconv.FormatFloat
的 'b' 转换格式一致。例如 -123456p-78
%e 科学计数法,例如 -1234.456e+78
%E 科学计数法,例如 -1234.456E+78
%f 有小数点而无指数,例如 123.456
%g 根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出
%G 根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的0)输出字符串与字节切片
%s 字符串或切片的无解译字节
%q 双引号围绕的字符串,由Go语法安全地转义
%x 十六进制,小写字母,每字节两个字符
%X 十六进制,大写字母,每字节两个字符指针
%p 十六进制表示,前缀 0x通过fmt.Printf() 可以格式化输出到终端,如果想要格式化存储到变量则是fmt.Sprintf()数字类型数字类型包括了:
uint8(无符号8位整型,0到255)
uint16(无符号16位整型,0到65535)
uint32(无符号32位整型,0到4294967295)
unint64(无符号64位整型,0到18446744073709551615)
int8(有符号8位整型,-128到127)
int16(有符号16位整型,-32768到32767)
int32(有符号32位整型 ,-2147483648 到 2147483647)
int64(有符号64位整型 ,-9223372036854775808到9223372036854775807)浮点型flat32: 32位浮点型数
flag64: 64位浮点型数
complex64:32 位实数和虚数
complex128:64 位实数和虚数类型转换举个例子来理解: var a int = 8 转换为int32 var b int32 = int32(a)
当我们代码中设计到数据计算的时候,要保证两个数据类型完全相同,
var a int 和 var b int32 是不能直接做计算处理的,这个时候就需要用到类型转换相关操作符
! && || 分别表示非,与,或== 、=、!=、 <、>、<=、>=

练习1

使用math/rand生成随机整数,10个小于100的随机整数以及10个随机浮点数

package mainimport ("fmt""math/rand"
)func rand_print(){for i:=0;i<10;i++{fmt.Println(rand.Int31n(100))fmt.Println(rand.Float32())}}
func main() {rand_print()
}

但是这里会造成每次运行程序生成的随机数是相同的,解决方式是加入随机种子:rand.Seed(time.Now().Unix())

五、常量

常用cost修饰,代表永远是只读不能修改
const只能修饰boolean,number(int相关类型,浮点类型,complex)和string

语法
const 变量名 [变量类型] = value其中变量类型可以省略

例子
const b string = "hello"
const b int = 23

通常定义常亮的写法

const (
a = 0
b = 1
)

高级方法
const (
a = iota
b
c
)
这里自动回吧a赋值为0,后面的变量一次加1

六、变量

声明一个变量的形式是使用var关键字格式如下:
var 变量名 变量类型

关于变量的声明常用的有三种方法:

  1. 指定变量类型,声明变量后不赋值,使用默认值。如果是数据类型是int,默认值为0,如果数据类型是字符串string,默认值为空,如果是布尔类型默认为false
  2. 不指定变量类型,根据值自行判断变量类型(个人不建议这种方法,go是强类型语言,定义变量最好指定变量类型)
  3. 省略var关键字通过:=方式定义变量,并赋值。例子name := "zhaofan"就相当于var name string然后name = "zhaofan"

变量的作用域

在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部
在函数外部生命的变量叫做全局变量,生命周期作用域整个包,如果是大写,作用域整个程序
在函数内的语句块的内的变量只在语句块,生命周期就是仅限于语句块内.这里主要指{} 括起来的语句块

通过下面的例子理解
例子1

package mainimport ("fmt"
)var a string = "zhaofan"func n(){fmt.Println(a)
}
func m(){a := "Jack"fmt.Println(a)
}func main(){n()m()n()
}

结果会依次打印zhaofan,Jack,zhaofan
这里就是验证了函数内部的定义的变量,生命周期仅限于函数内部
如果我们把m函数中的a:="Jack"改为a = "Jack"
结果为:zhaofan,Jack,Jack

例子2

package mainimport ("fmt"
)
var a stringfunc f1(){a := "Jack"fmt.Println(a)f2()
}
func f2(){fmt.Println(a)
}
func main(){a = "zhaofan"fmt.Println(a)f1()
}

这个程序的结果会打印zhaofan,Jack,zhaofan
其实这里还是要理解上面的说的关于变量的作用域

值类型和引用类型

值类型:变量直接存储值,即变量直接指向存在内存中的值。内存通常在栈中分配
值类型通常包括基本数据类型int,float,bool,string以及数组和struct
var i int = 5
var j int = i
这个时候i和j的值都为5
其实这里内存中是将i的值进行了拷贝,我们通过&获取变量的内存地址也可以看出
&i和&j 的内存地址是不同的,所以我如果在var j int = i,后继续更改i变量的值,并不会影响j的值,因为是不同的内存地址存放的值

引用类型:变量存的是一个地址,这个地址存储最终的值,内存通常在堆上分配。通过GC回收
一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。
引用类型通常包括指针,slice,map,chan等。
所以如果我们定义了两个引用类型变量像上面的值类型一样进行赋值操作则两者都会改变,因为两者的引用地址是相同的。

所以在引用类型中变量是拷贝的内存地址,而地址最终指向值

小练习1

package mainimport ("fmt"
)func main()  {var a int = 100var b chan int = make(chan int,1)fmt.Println("a=",a)fmt.Println("b=",b)
}

结果为:

从这里我们也可以看出值类型和引用类型的区别

小练习2

写一个小程序,交换两个整数的值

package mainimport ("fmt"
)func swap(a int,b int){a,b = b,afmt.Println("a=",a,"b=",b)
}func main() {change(5,4)
}

转载于:https://www.cnblogs.com/flying1819/articles/8832186.html

go 语言系列(二)基本数据类型和操作符相关推荐

  1. step在c语言中什么作用,C语言step-by-step(二)(数据类型)

    第2章:数据类型 先介绍一些计算机指令简单的知识: 大家都知道我们的计算机有硬盘.有内存这两样东西,都属于存储器,但是硬盘属于在掉电后不丢失信息,一般我们把资料存放在硬盘:然而内存掉电会丢掉所有信息, ...

  2. C语言系列(二):最近重拾C语言的想法,谈到C中易错点,难点;以及开源代码中C语言的一些常用技巧,以及如何利用define、typedef、const等写健壮的C程序...

    写在前面的话:本系列主要是自己在c语言运用时,对一些不了解,但开源代码中常用的技巧,和一些c语言中偏门和易错点进行解析. 加入了自己的分析,如果不到位请多海涵,另外,引用一些非常好的文章(都有引用li ...

  3. go 从入门到精通(二)基本数据类型和操作符

    一.文件名&关键字&标识符 所有go源码都是以.go结尾 标识符以字母或下划线开头,大小写敏感 下划线_是特殊标识符,用户忽略结果 保留关键字 导入包时可以设置别名 下面是保留关键字: ...

  4. OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)

    OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,unifo ...

  5. C语言速看,C语言高速入门系列(二)

    C语言高速入门系列(二) -----转载请注明出处coder-pig 本节引言: 在前面一节中我们对C语言进行了初步的了解,学会了使用IDE进行代码的编写,编译执行! 在这一节中我们会对C语言的基本的 ...

  6. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象、使用[]操作符和列名称访问dataframe指定数据列的数据(dataframe column data)

    R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象.使用[]操作符和列名称访问dataframe指定数据列的数据(dataframe column data) 目录 R语言使用多个 ...

  7. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象、使用$操作符和列名称访问dataframe指定数据列的数据

    R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象.使用$操作符和列名称访问dataframe指定数据列的数据 目录 R语言使用多个数据类型不同的向量数据创建一个dataframe ...

  8. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象、使用[]操作符和列索引数值访问dataframe指定数据列的数据(column index)

    R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象.使用[]操作符和列索引数值访问dataframe指定数据列的数据(column index) 目录 R语言使用多个数据类型不同的 ...

  9. C语言系列:2、数据类型、运算符和表达式

    C语言系列:2.数据类型.运算符和表达式 文章目录 C语言系列:2.数据类型.运算符和表达式 1. 前言 2. 变量名 3. 数据类型和长度 3.1 基本数据类型 3.2 short和long限定符 ...

最新文章

  1. lpk.dll是什么
  2. FormatJS – 让你的 Web 应用程序国际化
  3. php上传文件表单,php中关于普通表单多文件上传的处理方法
  4. RColorBrewer | R语言中的配色方法汇总(Ⅰ)
  5. Integer与int的种种比较你知道多少?
  6. java 多个引用指向同一个对象(含案例图解)
  7. BPSK调制gardner算法的MATLAB实现
  8. 前端页面预览word_js打开word文档预览操作示例【不是下载】
  9. linux中孚软件,中孚主机监控与审计系统
  10. linux光盘映像文件挂载,linux系统挂载光盘镜像ISO的方法
  11. java阿里天气接口_天气预报接口
  12. (三)JMockit API:@Mocked -基础篇
  13. python参考手册 豆瓣_Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶上)...
  14. 网吧计算机系统 影子,影子系统怎么用?实现像网吧电脑一样重启后自动还原系统教程(2)...
  15. Unity KeyCode键值
  16. Linux查看磁盘使用情况
  17. Object.defineProperty()个人理解
  18. Gym - 101291I Mismatched Socks(贪心)
  19. c++ ~ std::wstring 转LPWSTR
  20. 2022红队必备工具列表总结

热门文章

  1. 超详细SQLMap使用攻略及技巧分享
  2. git 拉取远程分支到本地
  3. 第一次小班课(英语)
  4. 20155216 Exp5 MSF基础应用
  5. JavaScript对象的chapterI
  6. 常使用的webserver地址
  7. ASP.NET 网站管理工具中的“安全”制表页
  8. MySQL Group Replication-MGR集群简介
  9. 小李飞刀:SQL题目第二弹!
  10. C++实现一个栈(使用类模板)