Golang-常量与运算符

常量

概述: 常量与运算符是基本概念,对于Go语言,可以使用它们进行赋值、计算和比较。Go语言支持的运算包括算术运算、比较运算和逻辑运算等。

所谓常量,就是值不能变的量,比如常用的数学常数“π”就是一个常量。大多数的编程语言会使用全大写的变量名表示常量,所以约定俗成,如果常量的名字是全大写的变量,一般不做修改。

常量的定义

显式定义

常量的声明以关键字const开头,后接变量类型并进行赋值,行尾没有其他标点符号。 常量的显式声明格式如下:

const 常量名 常量类型 = value

**注意⚠️:**一个常量被声明后可以不使用,但是变量一旦声明则必须使用。

package main

import "fmt"

func main() {
	const a float64 = 3.1415
	const b string = "Hello World"
	fmt.Println(a)
}

// 3.1415

隐式定义

由于Go是编译型语言,定义常量时可以省略常量类型,因为编译器可以根据变量的值来推断其类型。 常量的隐式声明格式如下:

const 常量名 = value
package main

import "fmt"

const a = 3.1415
const b = "Hello world"

func main() {
	fmt.Println(a)
}

// 3.1415

常量组定义

如果程序需要用到大量值相同的常量,我们可以直接定义常量组。在定义常量组时,若不提供初始值,则表示将使用上行的表达式。

package main

import "fmt"

const (
	a = 3.1415
	b
	c
	d = "Hello world"
)

func main() {
	fmt.Println("a:",a)
	fmt.Println("b:",b)
	fmt.Println("c:",c)
	fmt.Println("d:",d)
}

// a: 3.1415
// b: 3.1415
// c: 3.1415
// d: Hello world

常量枚举iota

枚举通常针对一个有穷序列集而言,一个集的枚举就是列出有穷序列集的所有成员。 Go语言现阶段还没有枚举,但是我们可以使用一种特殊常量“iota”来模拟枚举。 iota在const关键字出现时被重置为0,const中每新增一行常量声明,将使iota进行一次计数,可以简单地将iota理解为const语句块中的行索引。

package main

import "fmt"

const (
	a = iota //0
	b        //沿用上一行iota,并计数 1
	c = "Hello world" //iota += 1, iota = 2
	d        //沿用上一行"Hello world",iota += 1, iota = 3
	e = iota iota += 1, iota = 4
)

func main() {
	fmt.Println("a:",a)
	fmt.Println("b:",b)
	fmt.Println("c:",c)
	fmt.Println("d:",d)
	fmt.Println("e:",e)
}

// a: 0
// b: 1
// c: Hello world
// d: Hello world
// e: 4

运算符

Go数据是通过使用操作运算符来进行操作的,与数学运算符类似。操作运算符接受一个或多个参数,并生成一个新的值。

算术运算符

算术运算符用于Go语言的数学表达式中,它们的作用和在数学中的作用一样。

运算符说明示例
+加法:相加运算符两侧的值a + b
-减法:左操作数减去右操作数a - b
*乘法:操作符两侧的值相乘a * b
/除法:左操作数除以右操作数a / b
取模:左操作数除以右操作数的余数a % b
++自增:操作数加 1a++
--自减:操作数减 1a--
package main

import "fmt"

func main() {
	a := 1
	b := 2
	fmt.Println("a+b=",a+b)
	fmt.Println("a-b=",a-b)
	fmt.Println("a*b=",a*b)
	fmt.Println("a/b=",a/b)
	fmt.Println("a%b=",a%b)

	a++
	fmt.Println("a++后a值为:",a)
	b--
	fmt.Println("b--后b值为:",b)
}


// a+b= 3
// a-b= -1
// a*b= 2
// a/b= 0
// a%b= 1
// a++后a值为: 2
// b--后b值为: 1

比较运算符

比较运算符,对符号两边的变量进行比较,包括大小、相等等。如果比较结果是正确,返回真(true),否则返回假(false)。

运算符说明示例
==等于:比较对象是否相等a == b
!=不等于:比较两个对象是否不相等a != b
>大于:返回 a 是否大于 ba > b
<小于:返回 a 是否小于 ba < b
>=大于等于:返回 x 是否大于等于 yx >= y
<=小于等于:返回 x 是否小于等于 yx <= y
package main

import "fmt"

func main() {
	a := 1
	b := 2
	fmt.Println("a==b",a==b)
	fmt.Println("a!=b",a!=b)
	fmt.Println("a>b",a>b)
	fmt.Println("a<b",a<b)
	fmt.Println("a>=b",a>=b)
	fmt.Println("a<=b",a<=b)

}

// a==b false
// a!=b true
// a>b false
// a<b true
// a>=b false
// a<=b true

赋值运算符

最常用的赋值运算符是等号“=”,表示把右边的结果值赋值给左边的变量。其他的赋值运算符大多都是算术运算符和赋值运算符的简写。

运算符说明示例展开形式
=将右边值赋值给左边a=100a=100
+=将左边值加右边值a+=10a=a+10
-=将左边值减右边值a-=10a=a-10
*=将左边值乘以右边值a*=10a=a*10
/=将左边值除以右边值a/=10a=a/10
%=将左边值对右边值做取模a%=10a=a%10
package main

import "fmt"

func main() {
	var a = 10
	fmt.Println("a=",a)
	a += 2
	fmt.Println("a += 2 ,a=",a)
	a -= 2
	fmt.Println("a -= 2 ,a=",a)
	a *= 2
	fmt.Println("a *= 2 ,a=",a)
	a /= 2
	fmt.Println("a /= 2 ,a=",a)
	a %= 2
	fmt.Println("a %= 2 ,a=",a)
}

// a= 10
// a += 2 ,a= 12
// a -= 2 ,a= 10
// a *= 2 ,a= 20
// a /= 2 ,a= 10
// a %= 2 ,a= 0

位运算符

Go定义了位运算符,应用在两个数的运算上,会对数字的二进制所有位数从低到高进行运算。

运算符说明示例
按位与,如果相对应位都是 1,则结果为 1,否则为 0a & b
|按位或,如果相对应位都是 0,则结果为 0,否则为 1a | b
^按位异或,如果相对应位值相同,则结果为 0,否则为 1a ^ b
<<按位左移运算符,左操作数按位左移右操作数指定的位数a << b
>>按位右移运算符,左操作数按位右移右操作数指定的位数a >> b
package main

import "fmt"

func main() {
	a := 9
	b := 13
	fmt.Println("a&b = ",a&b)
	fmt.Println("a|b = ",a|b)
	fmt.Println("a^b = ",a^b)
	fmt.Println("a<<2 = ",a<<2)
	fmt.Println("b>>2 = ",b>>2)
}

// a&b =  9
// a|b =  13
// a^b =  4
// a<<b =  36
// a>>b =  3

与运算: 两个都为1 才为1 或运算: 有一个为1 就为1 异或运算: 两个值不同 才为1

  • 按位与:将参与运算的两个数按二进制位展开后进行与运算,9按二进制位展开为1001,13按二进制位展开为1101,1001和1101的与运算结果为1001,即十进制9。
  • 按位或:将参与运算的两个数按二进制位展开后进行或运算,9按二进制位展开为1001,13按二进制位展开为1101,1001和1101的或运算结果为1101,即十进制13。
  • 按位异或:将参与运算的两个数按二进制位展开后进行异或运算,9按二进制位展开为1001,13按二进制位展开为1101,1001和1101的异或运算结果为0100,即十进制4。
  • 按位左移:将参与运算的数按二进制位展开后全部左移指定位数,9按二进制位展开为1001,全部左移2位后变为100100,即十进制36。从右往左推补零
  • 按位右移:将参与运算的数按二进制位展开后全部右移指定位数,13按二进制位展开为1101,全部右移2位后变为11,即十进制3。从左往右推补零

逻辑运算符

逻辑运算符在Go语言中非常重要,广泛应用在逻辑判断的地方。

运算符说明示例
&&逻辑与,当且仅当两个操作数都为真,条件才为真a && b
||逻辑或,两个操作数中任意一个为真,条件为真a || b
!逻辑非,用来反转操作数的逻辑状态。如果条件为 true,则逻辑非运算符将得到 false!a
package main

import "fmt"

func main() {
	a := true
	b :=false
	fmt.Println("a&&b = ",a&&b)
	fmt.Println("a||b = ",a||b)
	fmt.Println("!a = ",!a)
}

// a&&b =  false
// a||b =  true
// !a =  false

其他运算符

需要注意的是按位取反运算符“^”,它和按位异或运算符不同,涉及的操作数只有一个,因此也可归类为单目运算符。

运算符说明示例
&返回变量存储地址&a
*指针变量*a
^按位取反(注意与按位异或区分)^a
package main

import "fmt"

func main() {
	a:=1
	var p *int
	p = &a
	fmt.Println("变量a地址为:",p)
	fmt.Println("变量a内容为:",*p)
	fmt.Println("^a = ",^a)
}

// 变量a地址为: 0xc00000a0b0
// 变量a内容为: 1
// ^a =  -2

正数1按二进制位展开为001,其中最左位0表示正数,取反操作对所有二进制位取反,结果为110,其中最左位1表示负数,即十进制-2。

运算符优先级

表由上至下代表优先级由高到低。(表中第一行运算符“^”代表按位取反运算符,第八行运算符“^”代表按位异或运算符。)

运算符关联性
! 、^ 、++、--从右到左
*(乘)、 / 、%从左到右
+(加) 、-(减)从左到右
<<、 >>从左到右
< 、<=、 >、 >=从左到右
==、 !=从左到右
&(按位与)从左到右
^从左到右
|从左到右
&&从左到右
||从左到右
=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=从右到左
Golang-常量与运算符
转载前请阅读本站 版权协议,文章著作权归 饼铛 所有,转载请注明出处。