文件名&关键字&标识符

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

下面是保留关键字:

break default func interface select
case defer go map struct
chan else goto package switch
const fallthough if range type
continue for import return var

golang程序的基本结构

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

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

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func add_num(n int){
  8. for i:=;i<=n;i++{
  9. fmt.Printf("%d+%d=%d\n",i,n-i,n)
  10. }
  11. }
  12.  
  13. func main(){
  14. add_num()
  15. }

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

main包中的代码:

  1. package main
  2. import (
  3. "fmt"
  4. "go_dev/day02/kexia02/add"
  5. )
  6.  
  7. func main() {
  8. fmt.Println(add.Name)
  9. }

add包中的代码

  1. package add
  2. var Name string = "zhaofan"
  3. var age int = 23

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

  1. package add
  2. var Name string
  3. var Age int
  4.  
  5. Name = "zhaofan"
  6. Age =

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

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

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. a "go_dev/day02/kexia02/add"
  6. )
  7.  
  8. func main() {
  9. fmt.Println(a.Name)
  10. fmt.Println(a.Age)
  11. }

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

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func init(){
  8. fmt.Println("执行初始化函数")
  9. }
  10.  
  11. func main() {
  12. fmt.Println("hello world")
  13. }

运行结果是先打印了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个随机浮点数

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. )
  7.  
  8. func rand_print(){
  9. for i:=;i<;i++{
  10. fmt.Println(rand.Int31n())
  11. fmt.Println(rand.Float32())
  12. }
  13.  
  14. }
  15. func main() {
  16. rand_print()
  17. }

但是这里会造成每次运行程序生成的随机数是相同的,解决方式是加入随机种子: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:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. var a string = "Lina"
  8.  
  9. func n(){
  10. fmt.Println(a)
  11. }
  12. func m(){
  13. a := "Jack"
  14. fmt.Println(a)
  15. }
  16.  
  17. func main(){
  18. n()
  19. m()
  20. n()
  21. }

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

例子2:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6. var a string
  7.  
  8. func f1(){
  9. a := "Jack"
  10. fmt.Println(a)
  11. f2()
  12. }
  13. func f2(){
  14. fmt.Println(a)
  15. }
  16. func main(){
  17. a = "Lina"
  18. fmt.Println(a)
  19. f1()
  20. }

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

值类型和引用类型

值类型:变量直接存储值,即变量直接指向存在内存中的值。内存通常在栈中分配
值类型通常包括基本数据类型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:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var a int =
  9. var b chan int = make(chan int,)
  10. fmt.Println("a=",a)
  11. fmt.Println("b=",b)
  12. }

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

 

例子2

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

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func swap(a int,b int){
  8. a,b = b,a
  9. fmt.Println("a=",a,"b=",b)
  10. }
  11.  
  12. func main() {
  13. change(,)
  14. }

转自:https://www.cnblogs.com/zhaof/p/7004940.html

golang基础之二-基本数据类型和操作符的更多相关文章

  1. python基础(二)-------数据类型

    python开发基础篇(二)数据类型 python数据类型有: 1.数字 1.只能存放一个值 2.一经定义,不可更改 3.直接访问 主要的分类为:整型,长整型,(python2有长整型的概念Pytho ...

  2. swift 学习(一)基础知识 (基本数据类型,操作符,流控制,集合)

    xcode 中调用API帮助 1.查看简单信息,选中后 按键 control +左键单击  或者按 右侧属性栏 里的帮助按钮 2.完整API,选中后 按键 control +左键双击 3.查看类.函数 ...

  3. JS基础(二)数据类型

    一.标量类型 1.字符串string类型:字符串需要用定界符包裹.定界符:单引号(‘’),双引号(“”). 2.数字类型:1)整型:所有整数 2)浮点型:所有浮点数 3.boolean类型:返回tru ...

  4. Java基础(二)数据类型

    数据类型主要分为基本类型和引用类型两大类. 一.基本类型 1.基本类型又分为数值类型和boolean类型, (1)数值类型包括浮点数类型.整数类型和字符类型 整型                    ...

  5. Golang基础(1):Go数据类型和变量

    一:Go数据类型 1.1 Go语言按照分类有以下几种数据类型 布尔型 布尔型的是一个常量true或者false 数字类型 整型int和浮点型 float32, float64 字符串类型 字符串就是一 ...

  6. Python基础(二)数据类型

    (一)数字 Python3中的数字类型分为3种,分别是整型,浮点型以及复数. Python2种的数字类型分为4种,分别是整型,长整型,浮点型以及复数. 其中长整型时Python2为应对位数较大的而设置 ...

  7. Lua 学习之基础篇二<Lua 数据类型以及函数库 汇总>

    引言 前面讲了运算符,这里主要对Lua的数据处理相关的数据类型和函数库进行总结归纳,后面会再接着单独分开讲解具体使用. 首先因为Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储 ...

  8. Golang基础(二)

    1. 条件语句 if ... else if ... else... package main import "fmt" func main() { { fmt.Printf(&q ...

  9. Golang 基础之基础语法梳理 (二)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...

随机推荐

  1. 洛谷5月月赛T30212 玩游戏 【分治NTT + 多项式求ln】

    题目链接 洛谷T30212 题解 式子很容易推出来,二项式定理展开后对于\(k\)的答案即可化简为如下: \[k!(\sum\limits_{i = 0}^{k} \frac{\sum\limits_ ...

  2. 《Java程序设计》第九周学习总结 20165218 2017-2018-2

    20165218 2017-2018-2 <Java程序设计>第9周学习总结 教材学习内容总结 第13章 Java网络编程 URL类 位于java.net包,使用URL创建对象的应用程序称 ...

  3. Atom实用配置插件for C++

    autocomplete-clang  自动补全 autocomplete for C/C++/ObjC using clang autocomplete-python 自动补全 Python pac ...

  4. 流媒体协议之JRTPLIB的使用20170919

    主要介绍JRTPLIB 2.x系列和3.x系列两种版本,它们的区别是2.x系列代码量少使用简单,但是只支持RFC 1889不支持RFC 3550,3.x支持RFC 3550,但代码量稍多,以及使用也稍 ...

  5. 简单shell 编程

    简单shell编程  by  dreamboy #!/bin/bash while true do echo clear echo echo " 系统维护菜单 " echo &qu ...

  6. [树莓派]wifi在面板看不到,但是可以scan到的解决方案

    突然遇到一个问题,发现在wifi面板中找不到WiFi,但是运行scan命令可以发现WiFi,多方查找资料终于找到了一个解决方案: 运行如下命令: sudo apt-get install wicd   ...

  7. 阳/阴性预测值Positive/negative Predictive Value(推荐AA)

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...

  8. OpenCV---模板匹配matchTemplate

    作用有局限性,必须在指定的环境下,才能匹配成功,是受到很多因素的影响,所以有一定的适应性 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是 ...

  9. Oracle用imp导入dmp 提示遇到 ORACLE 错误 12560 TNS: 协议适配器错误 解决方法

    用imp命令导入dmp文件时提示以下错误: IMP-00058: 遇到 ORACLE 错误 12560 : ORA-12560: TNS: 协议适配器错误 : IMP-00000: 未成功终止导入 : ...

  10. JavaScript 数组操作:slice vs splice

    在 JavaScript 中,对于数组的操作有两个很容易混淆的方法 splice, slice ,这里给大家推荐一篇介绍 splice, slice 二者区别的文章. In JavaScript, m ...