狂神说Go语言笔记—Go基础语法

注释

给别人看的,机器并不会执行这行语句

创新互联专注于企业网络营销推广、网站重做改版、山海关网站定制设计、自适应品牌网站建设、H5建站商城网站开发、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为山海关等各大城市提供网站开发制作服务。

1.单行注释

// 我是单行注释

2.多行注释

/*
我是多行注释
我是多行注释
我是多行注释
我是多行注释
*/

// 这是一个main函数,这个是go语言启动的入口
func main() {
   //fmt.Println :打印一句话,然后执行完毕后,进行换行
   fmt.Println("Hello,Word")
}

变量

字面理解为变量就是会变化的量

package main

import "fmt"

func main() {
   var name string = "DuPeng"
   fmt.Println(name)
}

注意:如果在点击这里执行会出错

出错提示:项目里有多个main方法

正确执行方式:鼠标单击右键执行,一定要在main方法外! 一定要在main方法外 !一定要在main方法外,重要事情说三遍

变量的定义

var name type

name

name 为变量,它指向的是地址,而这个地址指向内存空间,而内存空间的数据是可以更换的

var

声明变量的关键字,固定的写法,记住即可

type

代表变量的类型

定义多个变量

package main

import "fmt"
// “=” 赋值符号 将等号右边的值赋值给等号左边
func main() {
   var (
      //姓名
      name string
      //年龄
      age int
      //地址
      addr string
   )
    //string 默认值:空
	//int 默认值:0
   fmt.Println(name, age, addr)
}

变量的初始化

标准格式

var 变量名 类型 =值(表达式)

也可以先定义,再赋值

package main

import "fmt"

func main() {
   // “=” 赋值符号
   var (
      //姓名
      name string
      //年龄
      age int
      //地址
      addr string
   )
   name = "dupeng"
   age = 22
   addr = "成都"
   //string 默认值:空
   //int 默认值:0
   fmt.Println(name, age, addr)
}

短变量声明并初始化

import "fmt"

func main() {
   //    :=自动推导
   name := "dupeng"
   age := 18
   fmt.Println(name, age)
   //打印输出name和age的类型
   fmt.Printf("%T,%T", name, age)
}

打印输出声明类型

内存地址

打印内存地址

import "fmt"

func main() {
   var num int
   num = 100
   fmt.Printf("num:%d,内存地址:%p", num, &num)
}

不要忘记取地址符

值发生变换而内存地址不会发生改变,但每次重启系统就会重新分配一个新的地址空间

变量交换

package main

import "fmt"

func main() {
   /*
      在其他语言中 变量的交换为下列代码
      a=100
      b=200
      temp=0

      temp=a
      a=b
      b=temp
   */
   // 而在go语言中
   var a int = 100
   var b int = 200
   b, a = a, b
   fmt.Println(a, b)
}

匿名变量

特点是"_","_"本身就是一个特殊字符

被称为空白标识符,任何赋值给这个标识符的值都会被抛弃,这样可以加强代码的灵活性

package main

import "fmt"

func test() (int, int) {
   return 100, 200
}

func main() {
   a, b := test()
   fmt.Println(a, b)
}

当我们不想接收第二个值时可以废弃掉

package main

import "fmt"

func test() (int, int) {
   return 100, 200
}

func main() {
   a,_ := test()
   fmt.Println(a)
}

变量的作用域

一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。

局部变量

在函数体声明的变量,只作用在函数体内

全局变量

在函数体外声明的变量为全局变量

全局变量必须以var关键字开头,如果要在外部包使用全局变量的首字母必须大写

常量

是一个简单值得标识符,在程序运行时,不会被修改的量

数据类型:布尔型,数字型,(整数型、浮点型和复数型)和字符串型

const

当定义完常量后,常量不允许被修改,否则会出错

示例:

iota

特殊常量,可以认为是一个被编译器修改的常量

iota是go语言的常量计数器 从0开始 依次递增

直至const出现之时将被重置

package main

import "fmt"

func main() {
   const (
      a = iota //0
      b        //1
      c        //2
      d = "dd" // dd   iota=3
      e        //4
      f = 100  //100 iota=5
      g        //6
      h = iota //haha    iota=7
      i        //8
   )
   const (
      j = iota
      k
   )
   fmt.Println(a, b, c, d, e, f, g, h, i, j, k)
}
//输出结果:0 1 2 dd dd 100 100 7 8 0 1

基本数据类型

在Go编程语言中,数据类型用于声明函数和变量。

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

编译器在进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。

布尔型

布尔型的值只可以是常量true或者false

布尔类型的值默认为false

package main

import "fmt"

func main() {

   // var 变量名 数据类型
   var isFlang bool
   fmt.Println(isFlang)
}
//输出结果为:false

数字型

整形

整形int和浮点型float32、float64、Go语言支持整形和浮点型数字,并且支持负数,其中位 的运算采用补码

序号 类型和描述
1 uint8无符号8位整型(O到255)
2 uint16无符号16位整型(O到)
3 uint32无符号32位整型(O到)
4 uint64无符号64位整型(0到)
5 int8有符号8位整型(-128到127)
6 int16有符号16位整型(-到)
7 int32有符号32位整型(-到)
8 int64有符号64位整型(-到 )
package main

import "fmt"

func main() {
   //定义一个整形
    //byte uint8
	//rune int32
	//int int64
   var age int = 18
   fmt.Printf("%T,%d\n", age, age)

   //定义一个浮点型
   var money float32 = 300.15
   //这里打印浮点数类型为%f
    //默认是6位小数打印
   fmt.Printf("%T,%f\n", money, money)
}
//输出结果:int,18
//float32,300.

浮点型

1、关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位

2、尾数数部分可能丢失,造成精度损失。-123.0000901

序号 类型和描述
1 float32 IEEE-754 32位浮点型数
2 float64 lEEE-位浮点型数
3 complex64 32位实数和虚数
4 complex128 64位实数和虚数

类型别名

序号 类型和描述
1 byte类似于uint8
2 rune类似于int32
3 uInt32或64位
4 int与uint一样大小
5 uintprt无符号整形,用于存放一个指针

字符和字符串

字符串就是一串固定长度的字符连接起来的字符序列。

Go的字符串是由单个字节连接起来的。

Go语言的字符串的字节使用UTF-8编码标识Unicode文本。

package main

import "fmt"

func main() {
	//字符串 双引号
	var str string
	str = "hello,word"
	//输出打印的类型和值
	fmt.Printf("%T,%s\n", str, str)

	//	字符 单引号
	//字符为数值类型,需要%d打印
	//所有中国字的编码表:GBK
	//全世界的编码表:Unicode编码表
	v1 := 'A'
	v2 := "B"
	v3 := '中'

	//编码表 ASCII字符吗
	fmt.Printf("%T,%d\n", v1, v1)
	fmt.Printf("%T,%s\n", v2, v2)
	fmt.Printf("%T,%d\n", v3, v3)

	//字符串拼接
	fmt.Printf("hello" + "学相伴\n")
	//转义字符 \
	fmt.Printf("hello\"学相伴\"\n")

	//间隔符 \t tab
	fmt.Printf("hello\"学相伴\t")

}


数据类型转换

在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。

由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明

package main

import "fmt"

func main() {
   a := 3   //int
   b := 4.0 //float64

   //需求:将a转换为float64位
   c := float64(a)

   //boll 整形是不能转换为bool的
   //cannot convert a (variable of type int) to type bool
   //e := bool(a)
   fmt.Printf("%T\n", a)
   fmt.Printf("%T\n", b)
   fmt.Printf("%T\n", c)
   //fmt.Printf("%T\n", e)
}
/*
	输出结果为:
	int
	float64
	float64
	*/

类型转换只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(将int16转换为int32)。

当从一个取值范围较大的类型转换到取值范围较小的类型时(将int32转换为int16或将 float32转换为 int),会发生精度丢失(截断)的情况。

运算符

算术运算符

下表列出了所有Go语言的算术运算符。假定A值为10,B值为20。

运算符 描述 实例
+ 相加 A+B输出结果30
- 相减 A-B输出结果-10
* 相乘 A*B输出结果为200
/ 相除 B/A输出结果为2
% 求余 B%A输出结果为0
++ 自增 A++输出结果11
-- 自减 A--输出结果为9
package main

import "fmt"

func main() {
   var a int = 10
   var b int = 3

   // + - * / % ++ --
   fmt.Println(a + b)
   fmt.Println(a - b)
   fmt.Println(a * b)
   fmt.Println(a / b)
   a++ //a=a+1
   fmt.Println(a)
   a-- //a=a-1
   fmt.Println(a)
}
/*输出结果为:
13
7
30
3
11
10
*/

关系运算符

下表列出了所有Go语言的关系运算符。假定A值为10,B值为20。

运算符 描述 实例
== 检查两个值是否相等,如果相等返回True否则返回false A==B 为false
!= 检查两个值是否不相等,如果不相等返回True否则返回false A!=B为true
> 检查左边值是否大于右边值,如果是返回True否则返回false A>B 为false
< 检查左边值是否小于右边值,如果是返回True否则返回false A
>= 检查左边值是否大于等于右边值,如果是返回True否则返回false A>=B 为false
<= 检查左边值是否小于等于右边值,如果是返回True否则返回false A<=B 为true
package main

import "fmt"

func main() {
	var A int = 10
	var B int = 20
	//关系运算符,结果都是bool
	fmt.Println(A == B)
	fmt.Println(A != B)
	fmt.Println(A > B)
	fmt.Println(A < B)
	fmt.Println(A >= B)
	fmt.Println(A <= B)
/*
输出结果:
   false
   true
   false
   true
   false
   true
*/
}

逻辑运算符

下表列出了所有Go语言的逻辑运算符。假定A值为true,B值为false。

运算符 描述 实例
&& 逻辑AND运算符,如果两边的操作数都是True,则条件True,否则为False。 A&&B 为false
|| 逻辑OR运算符,如果两边的操作数有一个True,则条件True,否则为False。 A||B为true
逻辑NOT运算符,如果条件为True,则逻辑NOT条件False,否则为True。 !(A&&B )为true

逻辑与&&

package main

import "fmt"

func main() {
   var a bool = true
   var b bool = false

   //如果a和b同时为真
   if a && b {
      //那么我们输出为 true
      fmt.Println(a)
   } else {
      //否则输出为 false
      fmt.Println(b)
      // 输出的结果为 :false
   }
   
}

逻辑或||

遇真则真,全假则假

package main

import "fmt"

func main() {
   var a bool = true
   var b bool = false

   //当a或者b其中一个为真那么结果为真,
   if a || b {
      //那么我们输出为 true
      fmt.Println(a)
   }
//输出结果: true
}

逻辑非!

非也,也可以理解取反,表示否定的意思

package main

import "fmt"

func main() {
   var a bool = true
   var b bool = false

   //非b  那么!b=ture
   if !b {
      //那么我们输出为 a,因为a=true
      fmt.Println(a)
   }
//输出结果: true
}

位运算符(二进制)

运算符 描述 实例
& 按位与运算符"&"是双目运算符。都是1结果为1,否则是0 (A&B)结果为12,二进制为0000 1100
| 按位或运算符"|"是双目运算符。都是0结果为0,否则是1 (A |B)结果为61,二进制0011 1101
^ 按位异或运算符"A"是双目运算符。不同则为1,相同为0 (A^B)结果为49,二进制为0011 0001
&^ 位清空,a &^b,对于b上的每个数值,如果为0,则取a对应位上的数值,如果为1,则取0. (A&^B)结果为48,二进制为0011 0000
<< 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补O。 A<<2结果为240,二进制为1111 0000
>> 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 A>>2结果为15,二进制为0000 1111
package main

import "fmt"

func main() {

	//	二进制 逢二进一

	//位运算:二进制
	//	60  0011 1100
	//	13  0000 1101
	//----------------进行&运算
	//  12  0000 1100 我和你 同时满足
	//----------------进行|运算
	//  61	0011 1101  我或你 一个满足即可
	//	49	0011 0001  不同为1 相同为0

	var a uint = 60
	var b uint = 13

	//与运算结果
	fmt.Printf("%d,二进制:%b\n", a&b, a&b)

	//或运算结果
	fmt.Printf("%d,二进制:%b\n", a|b, a|b)

	//非运算结果
	fmt.Printf("%d,二进制:%b\n", a^b, a^b)

	//a向左移动两位
	//	60  0011 1100
	// 移动之后 1111 0000
	fmt.Printf("左移动后后的十进制:%d,左移动后的二进制:%b\n", a<<2, a<<2)

	//a向右移动两位
	//	60  0011 1100
	// 移动之后 0000 1111
	fmt.Printf("右移动后后的十进制:%d,右移动后的二进制:%b\n", a>>2, a>>2)

	/*
	   	输出结果:
	      12,二进制:1100
	61,二进制:
	49,二进制:
	左移动后后的十进制:240,左移动后的二进制:
	右移动后后的十进制:15,右移动后的二进制:1111

	*/
}

赋值运算符

下表列出了所有的Go语言的赋值运算符

运算符 描述 实例
= 简单的赋值运算符,将一个表达式的值赋给一个左值 C =A+B将A+B表达式结果赋值给C
+= 相加后再赋值 C +=A等于C=C+A
-= 相减后再赋值 C -=A等于C=C-A
*= 相乘后再赋值 C *=A等于C=C *A
/= 相除后再赋值 C/=A等于C=C/ A
%= 求余后再赋值 C%=A等于C=C%A
<<= 左移后赋值 C<<=2等于C=C<<2
>>= 右移后赋值 C>>=2等于C=c>>2
&= 按位与后赋值 C&=2等于C=C&2
^= 按位异或后赋值 C=2等于C=C2
!= 按位或后赋值 C|=2等于C=C|=2
package main

import "fmt"

func main() {
   var A int = 10
   var B int = 20
   var C int
   // 赋值运算符 =
   C = A + B
   fmt.Println(C) //结果为30

   //     相加后再赋值
   C += A //注意这里初始值为:C=30  C= C+A=30+10
   fmt.Println(C)
/*
输出结果:
   30
   40

*/
}

其他运算符

运算符 描述 实例
& 返回变量存储地址 &a;将给出变量的实际地址
* 指针变量 *a;是一个指针变量

拓展:键盘输入输出

package main

import "fmt"

func main() {
	var a int
	var b float32

	//定义了两个变量,想用键盘来录入这个两个变量
	//fmt.Println() 打印并换行
	//fmt.Printf() 格式化输出
	//fmt.Printf() 打印输出

	fmt.Printf("请输入两个数:1.整数 2.浮点数\n")
	fmt.Scanln(&a, &b)
	fmt.Printf("输出的两个数的结果为:\n")
	fmt.Println("a:", a, "b:", b)
	
	//	fmt.Scanln() 接受输入scan
	//	fmt.Scanf() 接受输入  格式化输入 作业
	//	fmt.Scan() 接受输入 作业

}

编码规范

为什么需要代码规范

  • 代码规范不是强制的,也就是你不遵循代码规范写出来的代码运行也是完全没有问题的
  • 代码规范目的是方便团队形成一个统一的代码风格,提高代码的可读性,规范性和统一性。本规范将从命名规范,注释规范,代码风格和Go语言提供的常用的工具这几个方面做一个说明。
  • 规范并不是唯一的,也就是说理论上每个公司都可以制定自己的规范,不过一般来说整体上规范差异不会很大。

代码规范

命名规范

命名是代码规范中很重要的一部分,统一的命名规则有利于提高的代码的可读性,好的命名仅仅通过命名就可以获取到足够多的信息。

  • 当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public) ;
  • 命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的private )

包名:package

保持package的名字和目录名保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。

package model
package main

文件名

尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词(蛇形命名)。


网页标题:狂神说Go语言笔记—Go基础语法
新闻来源:http://ybzwz.com/article/dsoidje.html