go语言学习之(二)--->基础语法

golang的基础语法

1. 命名规则

  • go 语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则

  • 必须以一个字母或下划线_开头,后面可以跟任意数量的字母、数字或下划线

  • go 语言中大小写字母认为是不同的

  • go 语言中有 25 个关键字,不能用于自定义名字

 还有 30 多个预定义的名字,用于内建的常量、类型和函数

内建常量

true	false	 iota	 nil

内建类型 

int	  int8	 int16	int32	   int64
uint	uint8	 uint16	 uint32	 uint64	 uintptr
float32		float64		complex128	complex64
bool	byte	rune	string	error

内建函数

make	len	cap	new	append	copy	close	delete
complex	 real	 imag
panic	recover

2.变量

声明变量

语法格式:

var 变量名 变量类型 

代码示例:

package main

import "fmt"

func main() {
/*
    变量不引用会报错
    */

// 1. 直接声明
var v1 int
var v2 int

// 2. 一次声明多个变量
var v3, v4 int

var (
    v5 int
    v6 int
)
fmt.Println(v1, v2, v3, v4, v5, v6)
}

变量初始化

代码示例:

package main

import "fmt"

func main() {
// 1. 直接初始化
var v1 int = 1

// 2. 自动推导初始化
var v2 = 2

// 3. 声明并初始化
v3 := 3

fmt.Println(v1, v2, v3)
}

变量赋值

代码示例:

package main

import "fmt"

func main() {
// 1. 直接赋值
var v1 int
v1 = 1

// 2. :=
v2 := 2

// 3. 多重赋值
var v3, v4 int

fmt.Println(v1, v2, v3, v4)
}

细心的同学应该看出来了,在某种程度来说变量的初始化跟赋值是一回事,后面我们将文章中进一步学习 

匿名变量

_单下划线表示匿名变量,为了防止变量被引用而报错

package main

import "fmt"

func test() (int, int) {
return 1,2
}

func main() {
//  _单下滑线表示匿名变量,引用不报错
v1, _ := test()
fmt.Println(v1)
}

3.常量与枚举

const 关键字 定义常量

package main

import "fmt"

// 声明在函数外部
const filename = "123.txt"

const (
username = "admin"
password = "admin"
)

func main() {
// 声明在函数的内部
const filename = "456.txt"

fmt.Println(filename)
}

iota 常量生成器和枚举类型

  package main

  import "fmt"

  // 枚举
  func enums001() {
  	const (
  		v1 = 0
  		v2 = 1
  		v3 = 2
  	)
  	fmt.Println(v1, v2, v3)

  	// 输出结果 0 1 2
  }

  // 可省略的枚举
  func enums002() {
  	const (
  		v1 = 0
  		v2
  		v3 = 1
  		v4
  	)

  	fmt.Println(v1, v2, v3, v4)

  	// 输出结果 0 0 1 1
  }

  // 定义自增的枚举类型
  // iota默认值为0
  // 往下依次自增
  func enums003() {
  	const (
  		v1 = iota
  		v2
  		v3
  		v4
  	)

  	fmt.Println(v1, v2, v3, v4)

  	// 输出结果 0 1 2 3
  }

  // 计算枚举
  func enums004() {
  	// b等于1左移
  	// 1<<(10 * 0)    1 << 0     相当于 1*2^0
  	const (
  		b = 1 << (10*iota)
  		kb
  		mb
  		gb
  		tb
  		pb
  	)
  	fmt.Println(b, kb, mb, gb, tb, pb)

  	// 输出结果
  }

  func main() {
  	//enums001()
  	//enums002()
  	//enums003()
  	enums004()
  }

4.基本数据类型

int8 是有符号类型  unit8是无符号类型

go语言当中不同的类型的数据不能相加,会编译错误。

 整型

 代码示例:

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var v1 int
	v1 = 123
	v2 := 42
	fmt.Println(reflect.TypeOf(v1))
	fmt.Println(reflect.TypeOf(v2))
}

输出 int 类型 

浮点型

代码示例:

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var f1 float32
	f1 = 12.5
	f2 := 13.66
	fmt.Println(reflect.TypeOf(f1))
	fmt.Println(reflect.TypeOf(f2))
}

布尔型

代码示例:

package main

import (
	"fmt"
	"reflect"
)

func main() {
	// 只有true和false两个值
	var b1 bool
	b1 = false
	fmt.Println(b1)

	// 可以使用 == 或 != 得到布尔值
	b2 := (1!=2)
	fmt.Println(reflect.TypeOf(b2))

	// 使用 ! 对布尔类型进行取反
	b3 := !b2
	fmt.Println(b3)
}

byte字符型

代码示例:

package main

import (
	"fmt"
	"reflect"
)

func main() {
	// 单引号赋值byte
	var ch byte
	ch = 'a'
	fmt.Println(ch)

	// 格式化输出
	fmt.Printf("ch = %c\n", ch)

	// uint8
	fmt.Println(reflect.TypeOf(ch))
}

字符串

代码示例:

package main

import "fmt"

func main() {
	// 字符串使用双引号赋值
	var s1 string
	s1 = "abc"
	fmt.Println(s1)

	// 取字符串中第一个字符
	ch := s1[0]
	fmt.Println(ch)

	// 反引号用来创建原生的字符串字面量(原格式输出)

	s2 := `hello
xxxxx
	world
`
	fmt.Println(s2)
}

5.fmt包的使用

格式化参数列表

格式含义
%%一个%字面量
%b一个二进制整数值(基数为 2),或者是一个(高级的)用科学计数法表示的指数为 2 的浮点数
%c字符型。可以把输入的数字按照 ASCII 码相应转换为对应的字符
%d一个十进制数值(基数为 10)
%e以科学记数法 e 表示的浮点数或者复数值
%E以科学记数法 E 表示的浮点数或者复数值
%f以标准记数法表示的浮点数或者复数值
%g以%e 或者%f 表示的浮点数或者复数,任何一个都以最为紧凑的方式输出
%G以%E 或者%f 表示的浮点数或者复数,任何一个都以最为紧凑的方式输出
%o一个以八进制表示的数字(基数为 8)
%p以十六进制(基数为 16)表示的一个值的地址,前缀为 0x, 字母使用小写的 a-f 表示
%q使用 Go 语法以及必须时使用转义,以双引号括起来的字符串或者字节切片[]byte,或者是以单引号括起来的数字
%s字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0'结尾,这个'\0'即空字符)
%t以 true 或者 false 输出的布尔值
%T使用 Go 语法输出的值的类型
%U一个用 Unicode 表示法表示的整型码点,默认值为 4 个数字字符
%v使用默认格式输出的内置或者自定义类型的值,或者是使用其类型的 String()方式输出的自定义值,如果该方法存在的话
%x以十六进制表示的整型值(基数为十六),数字 a-f 使用小写表示
%X以十六进制表示的整型值(基数为十六),数字 A-F 使用小写表示

输出示例:

package main

import "fmt"

func main() {
	// 整型
	a := 16

	// %b 二进制输出
	fmt.Printf("%b\n", a)
	fmt.Printf("%%\n", a)
}

输入示例:

package main

import "fmt"

func main() {
	// 定义接收输入内容的变量
	var age int
	fmt.Printf("请输入你的年龄: ")
	// 接收输入
	fmt.Scan(&age)

	fmt.Printf("输入的年龄为: %d", age)
}

6.类型别名

type关键字自定义类型

package main

import (
	"fmt"
	"reflect"
)

// type 自定义类型名 原类型
type myint int

func main() {
	var v1 myint
	v1 = 10
	fmt.Println(reflect.TypeOf(v1))
}

// 输出结果: main.myint

7.类型转换

go语言不允许隐式转换

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var a byte
	a = 97

	var b int
	b = int(a)
    // 输出变量类型
	fmt.Println(reflect.TypeOf(b))
}

8.运算符

符号说明
+相加
-相减
*相乘
/相除
%求余
++自增
--自减
package main

import "fmt"

func main() {
	a := 10
	b := 6
	// +
	fmt.Println(a+b)
	// -
	fmt.Println(a-b)
	// *
	fmt.Println(a*b)
	// /
	fmt.Println(a/b)
	// %
	fmt.Println(a%b)
	// ++
	fmt.Println(a)
	a++
	fmt.Println(a)
	// -
	fmt.Println(b)
	b--
	fmt.Println(b)
}

 关系运算符

符号说明
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于

package main

import "fmt"

func main() {
	a := 10
	b := 6
	// ==
	fmt.Println(a==b)
	// !=
	fmt.Println(a!=b)
	// >
	fmt.Println(a>b)
	// <
	fmt.Println(a<b)
	// >=
	fmt.Println(a>=b)
	// <=
	fmt.Println(a<=b)
	// ==
	fmt.Println(a==b)
}

逻辑运算符

符号说明
&&
||
!
package main

import "fmt"

func main() {
	a := 10
	b := 6
	c := 6
	// &&
	fmt.Println(a > b && b >= c)
	// ||
	fmt.Println(a > b || b > c)
	// !
	var d bool
	fmt.Println(!d)
}

 赋值运算符

运算符描述实例
=简单的赋值运算符,将一个表达式的值赋给一个左值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 = C ^ 2
|=按位或后赋值C |= 2 等于 C = C | 2

位运算 

运算符描述实例
&按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。(A & B) 结果为 12, 二进制为 0000 1100
|按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或(A | B) 结果为 61, 二进制为 0011 1101
^按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为 1。(A ^ B) 结果为 49, 二进制为 0011 0001
<<左移运算符"<<"是双目运算符。左移 n 位就是乘以 2 的 n 次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补 0。A << 2 结果为 240 ,二进制为 1111 0000
>>右移运算符">>"是双目运算符。右移 n 位就是除以 2 的 n 次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。A >> 2 结果为 1
package main

import "fmt"

func main() {

	var a uint = 60      /* 60 = 0011 1100 */
	var b uint = 13      /* 13 = 0000 1101 */
	var c uint = 0

	c = a & b       /* 12 = 0000 1100 */
	fmt.Println(c)

	c = a | b       /* 61 = 0011 1101 */
	fmt.Println(c)

	c = a ^ b       /* 49 = 0011 0001 */
	fmt.Println(c)

	c = a << 2     /* 240 = 1111 0000  a*(2**2) */
	fmt.Println(c)

	c = a >> 2     /* 15 = 0000 1111 a/(2*2) */
	fmt.Println(c)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值