4. 常量与运算符

include

  1. 常量的定义
  2. 常量的初始化规则与枚举
  3. 在定义常量组的时候,如果不提供初始值,则表示使用上行的表达式
  4. iota
  5. 运算符(一元运算符,二元运算符)

常量的定义

  • 常量的值在编译的时候就已经确定了
  • 常量的定义格式与变量基本相同
  • 等号右侧必须是常量或者常量表达式
  • 常量表达式中的函数必须是内置函数
  • 常量最好使用全部为大写,如果不想被外部调用,那么可以在常量前面添加_,如_MAX_CONN
    下面请看赋值的代码:
const a int =1
const b = "A"

const (
	c=a
	d=a+1
	c=a+2
)

const a,b,c = 1,2,3

常量的初始化规则与枚举

  • 在定义常量组的时候,途观不提供初始值,则表示使用上行的表达式
  • 使用相同的表达式不代表具有相同的值
  • iota是常量的计数器,从0开始,组中每定义1个常量自动递增1
  • 通过初始化规则与iota可以达到枚举的效果
  • 每遇到一个const关键字,iota就会重置为0
在定义常量组的时候,如果不提供初始值,则表示使用上行的表达式

常量的值不能依赖于变量,变量在运行的时候才会使用,所以像下面的代码,在编译的时候就会报错:


var xx = 123
const (
	c = len(xx)
	b
	c
)

但是下面的例子是正确的,常量的值依赖于另一个常量:

const (
	c = "sadfasdf"
	b = len(c)
)

我们再看一个例子,如果使用小括号批量赋值给常量的时候,如果第一个常量有值,剩下的没有值,那么默认剩下的常量的值会继承第一个常量的值。代码如下:

package main

import (
	"fmt"
)

const (
	c = "sadfasdf"
	b    // b 和 a都没有赋值,所以我们在打印的时候,abc三个值都是一样的
	a
)

func main() {
	fmt.Println(b, a)   // b 和 a都没有赋值,所以我们在打印的时候,abc三个值都是一样的
}

如果一行有多个常量赋值,也可以这么写

package main

import (
	"fmt"
)

const (
	c, b = "sadfasdf", 1123
	a, d  // a,d这两个常量的数量必须和第一行保持默认才行,即上面多少个常量下面就得多少个,保持一致才行
	v, y
)

func main() {
	fmt.Println(v, a, y)

iota

iota能够显示这个常量在const组里面的第几个常量,代码如下

const (
	c  = "sadfasdf"
	a  = iota
	he = 12344
	v  = iota
	d
)
func main() {
	fmt.Println(d, c)
}

打印的结果是:4 sadfasdf ,iota的值从第一个常量开始为0,然后递增1,所以d为4。
下面再看一个例子:

const (
	c  = "sadfasdf"
	a  = iota
	he = 12344
	v  = iota
	d
)

const (
	y = iota
)

func main() {
	fmt.Println(d, c, y)
}

y打印出来的值为0,因为iota在遇到新的const的时候,会自动重置为0,所以y为0

运算符

  • go中的运算符均是从左往右结合的
优先级

一元运算符是最高的,二元是最低

  • ^ !(取反) 一元运算符
    • / % <<(左移) >>(右移) & &^ + - | ^ == != < <= >= > 二元运算符
  • <- 专门用于channel
  • && 或关系
  • || 否关机
如何判断^ 是属于一元运算符还是二元运算符

标准: ^ 如果左右都有数字就是二元,只有右侧有数才是一元
一元

func main() {
	fmt.Println(^2)
}

二元:

func main() {
	fmt.Println(1 ^ 2)
}
& &^ | ^ */ 位运算符讲解

我们举个例子:

十进制数字 二进制数字
6 0110
11 1011

我们拿上面两个数计算来得

运算符 作用 二进制结果 十进制结果
& 二进制位全为1 才为1 0010 0
| 二进制位有1即为1 1111 15
^ 二进制位全为1 就为0 1101 13
&^ 第二个数位1的时候,才会把第一个数的相同位改为0 0100 4

练习例子之生成随机数,git

  1. 生成100以内的随机数和10个浮点随机数
// randnum
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	rand.Seed(time.Now().Unix())
	var a []int
	var b []float64
	for i := 0; i < 11; i++ {
		a = append(a, rand.Intn(100))
		b = append(b, rand.Float64()*10)
	}
	fmt.Println(a)
	fmt.Println(b)
}

posted @ 2017-06-11 21:22  温柔易淡  阅读(365)  评论(0编辑  收藏  举报