文档章节

Go笔记-运算符和流程控制

漂泊尘埃
 漂泊尘埃
发布于 2017/02/27 15:57
字数 1727
阅读 3
收藏 0
点赞 0
评论 0

运算符

  • b = b + a 可以写成b += a
  • 除以浮点数0.0会得到+Inf
	a := 1.0 - 1.0
	fmt.Println("Hello, ", 9.0/a) // Hello,  +Inf
  • 对于整数和浮点数,可以使用一元运算符 ++(递增)和 --(递减),但只能用于后缀。i++ 带有 ++ 和 -- 的只能作为语句,而非表达式,因此 n = i++ 这种写法是无效的,其它像 f(i++) 或者 a[i]=b[i++] 这些可以用于 C、C++ 和 Java 中的写法在 Go 中也是不允许的.

  • 在运算时 溢出 不会产生错误,Go 会简单地将超出位数抛弃。如果你需要范围无限大的整数或者有理数(意味着只被限制于计算机内存),你可以使用标准库中的 big 包,该包提供了类似 big.Int 和 big.Rat 这样的类型。

  • %取模运算符的符号和被取模数的符号总是一致的,因此-5%3和-5%-3结果都是-2.

流程控制

条件语句if-else

i := 4
if i < 0 {
	fmt.Println("<0")
} else if i == 0 {
	fmt.Println("=0")
} else {
	fmt.Println(">0")
}
  • 条件语句不需要使用括号将条件包含起来();
  • 无论语句体内有几条语句,花括号{}都是必须存在的;
  • 左花括号{必须与if或者else处于同一行;
  • 在if之后,条件语句之前,可以添加变量初始化语句,使用;间隔;
	if i, j := 0, 0; i <= 0 {
		fmt.Println(i, j)
	}

i, j只在if-else中有效,如果之前有i,j定义,则会覆盖

选择语句switch

i := 7
switch i {
case 0:
	fmt.Println(0)
case 1:
	fmt.Println(1)
case 2:
	fallthrough // 向下执行
case 3:
	fmt.Println(3)
case 4, 5, 6:
	fmt.Println("4,5,6")
default:
	fmt.Println("default")
}
  • 左花括号{必须与switch处于同一行;

  • 条件表达式不限制为常量或者整数;

	str := "a"
	switch str {
	case "a":
		fmt.Println("a")
	case "b":
		fmt.Println("b")
	}
  • 单个case中,可以出现多个结果选项;

    case 4,5,6

  • 与C语言等规则相反,Go语言不需要用break来明确退出一个case;默认退出

  • 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case,fallthrough不再判断条件

  • 可以不设定switch之后的条件表达式,在此种情况下,整个switch结构与多个if...else...的逻辑作用等同。

	i := 0
	switch {
	case 0 <= i && i <= 3:
		fmt.Println("0~3")
	case i > 3:
		fmt.Println(">3")
	}
  • 带初始化语句

    switch i, j := 9, 10; {
    case i == 1 && j == 10:
    	fmt.Println("no")
    case i == 9 && j == 10:
    	fmt.Println("yes")
    }
    
  • fallthrough示例

i := 0
switch i {
case 0:
	fmt.Print("0 ")
	fallthrough
case 1:
	fmt.Print("1")
}
输出:0 1

switch 与类型判断:(database.sql/convert.go:convertAssign())

var src interface{}

src = "123"

switch s := src.(type) {
case string:
	fmt.Printf("1:type:%T, value:%v\n", s, s)
	fmt.Println(strconv.ParseInt(s, 10, 64))
default:
	fmt.Printf("2:type:%T, value:%v", s, s)
}

循环语句for

  • 只支持for,不支持while,do-while
  • 左花括号{必须与for处于同一行。
  • 特别注意,永远不要在循环体内修改计数器,这在任何语言中都是非常差的实践!
  • Go语言中的for循环与C语言一样,都允许在循环条件中定义和初始化变量,唯一的区别是,Go语言不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量
	for i, n := 0, 10; i < n; i++ {
		fmt.Printf("%d\t", i)
	}
  • 支持continue和break来控制循环
for i, n := 0, 10; ; i++ {
		fmt.Printf("%d\t", i)
		if i >= n {
			break
		}
	}

loop:
	for i := 0; ; i++ {
		fmt.Printf("for1 :%d ", i)
		for j := 0; j <= i; j++ {
			if i == 1 && j == 1 {
				break loop
			}
		}
	}
  • 无限循环
for {
}
  • 只有判断条件,相当于while
for i < 10 {
}
  • 循环变量Unicode字符
	for i, v := range "汉字\x80" {
		fmt.Printf("character %#U starts at byte position %d\n", v, i)
	}

输出:

character U+6C49 '汉' starts at byte position 0
character U+5B57 '字' starts at byte position 3
character U+FFFD '�' starts at byte position 6

错误的编码(上例中的\x80)会占用一个字节,使用U+FFFD来代替

注意变量i第二次是3,而不是1

当for i:=range “sss”时,i代表的是下标。

  • Go没有逗号操作符,并且++和--是语句而不是表达式。因此,如果你想在for中运行多个变量,你需要使用并行赋值(尽管这样会阻碍使用++和--)
for i, j := 0, 5; i < j; i, j = i+1, j-1 {
	fmt.Println(i, j)
}
  • 循环遍历修改数组

当使用下面的方式修改数组时: items := [...]int{10, 20, 30, 40, 50} for _, item := range items { item *= 2 } fmt.Println(items)

items的元素没有被修改。因为item是元素的拷贝而不是指针。 使用下面的方式可修改: items := [...]int{10, 20, 30, 40, 50} for i, _ := range items { items[i] *= 2 }

- for中变量的作用域 for i := 0; i < 3; i++ { for i := 0; i < 3; i++ { fmt.Println(i) } }

内层for也声明了i,这说明这个i屏蔽了外层的i,所以最后输出的是9个数。

for range

	var x = []int{5, 12, 32}

	// 使用值和索引
	for i, v := range x {
		fmt.Println(i, "=>", v)
	}
	
	// 只使用索引
	for v := range x {
		fmt.Println(v) // v是索引,0-3
	}
	
	// 只使用值
	for _, v := range x {
		fmt.Println(v)
	}
	
	// 不使用循环中的值
	for _ = range x {
		fmt.Println(80)
	}
	
	// 不使用循环中的值,需要1.4以后版本
	for range x {
		fmt.Println(90)
	}

range会复制对象

a := [3]int{0, 1, 2}
// Q: range时内存中是不是有一个原数组和一个拷贝的数组
for i, v := range a {
	if i == 0 {
		a[1], a[2] = 999, 999 // 修改原数组
		fmt.Printf("%v, %p \n", a, &a)
	}
	a[i] = v + 100 // 此时v是range之前原数组复制的值
	fmt.Printf("%v, %p \n", a, &a)
}

fmt.Printf("%v, %p \n", a, &a)

输出:

[0 999 999], 0x20819e020 
[100 999 999], 0x20819e020 
[100 101 999], 0x20819e020 
[100 101 102], 0x20819e020 
[100 101 102], 0x20819e020 

i和v的值在range时就被拷贝了,而引用类型不会复制底层数据:

s := []int{1, 2, 3, 4, 5}
for i, v := range s { // 复制 struct slice {pointer, len, cap}
	if i == 0 {
		s = s[:3]  // 对slice的修改不会影响range,修改的是range外的s
		s[2] = 100 // 对底层数据的修改,这里的s也是range外的
	}
	fmt.Println(i, v)
}
fmt.Println(s)

输出:

0 1
1 2
2 100
3 4
4 5
[1 2 100]

另外两种引用类型 map, channel 是指针包装,而不像 slice 是 struct。

for和闭包

	arr := []int{12, 34, 56}
	for _, v := range arr {
		go func() {
			fmt.Println(v)
		}()
	}
	time.Sleep(5 * time.Second)

上面输出都是56.原因不明。

使用下面的语句可以达到遍历的目的:

	arr := []int{12, 34, 56}
	for _, v := range arr {
		go func(v int) {
			fmt.Println(v)
		}(v)
	}
	time.Sleep(5 * time.Second)

goto语句

func myfunc() {
	i := 0
HERE:
	fmt.Println(i)
	i++
	if i < 10 {
		goto HERE
	}
}

如果您必须使用 goto,应当只使用正序的标签(标签位于 goto 语句之后),但注意标签和 goto 语句之间不能出现定义新变量的语句,否则会导致编译失败。

// compile error goto2.go:8: goto TARGET jumps over declaration of b at goto2.go:8
package main

import "fmt"

func main() {
		a := 1
		goto TARGET // compile error
		b := 9
	TARGET:  
		b += a
		fmt.Printf("a is %v *** b is %v", a, b)
}

break和continue

break可用于 for, switch, select, 而 continue 只能用于 for.

© 著作权归作者所有

共有 人打赏支持
漂泊尘埃

漂泊尘埃

粉丝 5
博文 35
码字总数 70992
作品 0
朝阳
第一、二次笔记总结

1:常用的DOS命令 A:盘符切换 盘符: 然后回车 B:列出当前目录下的文件以及文件夹 dir 然后回车 C:创建目录(文件夹) 了解 md 目录名称 D:删除目录 了解 rd 目录名称 E:进入指定目录 a:单级目录...

郭冲冲冲冲
2017/04/05
0
0
Elixir学习笔记(模型匹配、控制语句)

模型匹配 模式匹配是 Elixir 很强大的特性,它允许我们匹配简单值、数据结构、甚至函数。 匹配运算符 在Elixir中,运算符实际上叫做 匹配运算符。通过这个匹配操作符,我们可以赋值和匹配值。...

程序员小哥哥
04/12
0
0
PHP三小时入门笔记(2014-9-3)

PHP三小时入门笔记(2014-9-3) 1、PHP是什么:编程语言 2、PHP 代码是运行在服务端的 3、行该脚本后,客户端就能接收到其结果,但他们无法得知其背后的代码是如何运作的 4、甚至可以将 web ...

GZhiDao
2015/11/26
42
0
T-SQL程序设计基础

T-SQL就是transact-sql,是标准sql在mssql环境下程序的设计语言的增强版,用来让应用程序与sql server沟通的主要语言。 T-SQL主要包括sql server数据类型、语言元素和游标。 1.数据类型 数据...

邵鸿鑫
2013/08/14
0
0
shell脚本中的逻辑判断,文件目录属性判断,if特殊用法,case语句

笔记内容: 20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断 笔记日期:2017-11-22 20.5 shell脚本中的逻辑判断 在所有的编程语言中都会有if语句来进...

ZeroOne01
2017/11/22
0
0
【Python】语法学习笔记

1、属性命名规定: python中的标识符是区分大小写的。 以下划线开头的标识符是有特殊意义的。以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用"from...

rathan0
2016/03/06
5
0
Python3.5从零开始学 - 第二章开始Py之旅

2.2 数据类型 数据类型分为6种: Number 数字 String 字符串 List 列表 Tuple 元祖 Sets 集合 Dictionary 字典 数值类型3种: int 整数 float 浮点数 complex 复数 2.2.1整型 整数与整数相除默...

九亿少女的电竞梦
05/31
0
0
运算符_键盘录入_流程控制语句

一、运算符 (1)算术运算符 ①单目:+(取正)、-(取负)、++(自增)、- -(自减) ②双目:+、-、*、/、%(取余) ③三目:比较表达式?表达式1:表达式2; (2)位移运算符 <<(带符号左移)、>>(带符号右移...

icecoola_
2017/04/05
0
0
Linux Shell 编程笔记

常用命令 比较运算符 数值及字符串比较 判断文件属性 判断文件权限 文件间判断 字符处理命令 正则表达式 基本格式 正则表达式封装类 转义字符控制 控制序列指示器(Control Sequence Indicat...

海涛
2016/03/21
122
0
mysql学习笔记(四)--- 聚合函数、控制流程函数

【正文】 一、navicat的引入:(第三方可视化的客户端,方便MySQL数据库的管理和维护) NavicatTM是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设...

舞艺超炫
2017/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spark Streaming + Kafka Integration Guide

The Spark Streaming integration for Kafka 0.10 is similar in design to the 0.8 Direct Stream approach. It provides simple parallelism, 1:1 correspondence between Kafka partition......

刺猬一号
10分钟前
0
0
数据结构与算法2

一个数组的例子,实现查找,显示和删除的功能。 在这个数组中存储的数据类型是long型,使用long型为的是表明这是数据,而int型被用来表示下标。通常数据结构存储的数据项包含有好几个字段,所...

沉迷于编程的小菜菜
21分钟前
0
0
Python3 基于 requests 批量下载图片

Python3 基于 requests 批量下载图片 import requestsheaders = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encod......

leeyi
22分钟前
0
0
java获取当前时间所在一周的周一和周日日期

/** * 当前时间所在一周的周一和周日时间 * @param time 当前时间 * @return */ public static Map getWeekDate(String time) { Map map = new HashedMap(); SimpleDateFormat sdf = new Si......

小弱鸡
53分钟前
0
0
Redis数据的导出和导入(dump和load方式)

网上有些文章已经不再适用,本人也是踩了些坑,在此记录下。 迁移redis数据一般有如下3种方式: 第三方工具redis-dump,redis-load aof机制,需要开启aof功能 rdb存储机制 这里介绍第一种方式...

iplusx
58分钟前
2
0
ElasticSearch 高亮显示大文档搜索结果

2016年12月,我们开始研究Ambar——一个文档搜索系统。Ambar使用ElasticSearch作为核心搜索引擎。 在Ambar开发的过程中,我们处理了很多与ES相关的问题,我们想分享我们得到的宝贵经验。让我...

九州暮云
今天
1
0
Python 使用 pywifi 模块 破解wifi密码

git https://github.com/awkman/pywifi 常见常量 from pywifi import const# Define interface status.IFACE_DISCONNECTED = 0IFACE_SCANNING = 1IFACE_INACTIVE = 2IFACE_CONNEC......

阿豪boy
今天
2
0
phpstorm使用Iedis

phpstorm的redis插件Iedis是真好用 看了网上挺多的文章,但是由于我系统还是ubuntu,就有点尴尬了,现在破解之后,留个笔记,即使自己之后有需要也可以很快翻阅 先下载资源 资源下载 zip压缩...

贤郎--均灵
今天
0
0
第三章 spring-bean之FactoryBeanRegistrySupport(4)

前言 从FactoryBeanRegistrySupport类的名字可以看出FactoryBeanRegistrySupport负责FactoryBean的注册与支持。如果想知道FactoryBean相关的资料,请阅读spring-bean中关于FactoryBean的解读...

鸟菜啊
今天
0
0
CentOS “Destination Host Unreachable”问题解决办法

挑战极速安装CentOS时遇到局域网主机不能通信的情况: [root@zjd network-scripts]# ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=1 ttl=......

wffger
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部