值类型和应用类型

1、值类型:变量直接存储值,内存通常在栈中分配

  基本数据类型int、float、bool、string以及数组和struct。如果在函数里面修改了,函数外不变

2、引用类型:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。通过GC回收。

  指针、slice、map、chan等都是引用类型。如果在函数里面修改了,函数外面也会变

例一

package main

import "fmt"

func modify(a int) {
a = 10
}
func modify1(a *int) {
*a = 10
} func main() {
var a = 100
var b chan int = make(chan int,1)
fmt.Println("a=",a)
fmt.Println("b=",b) modify(a)
fmt.Println(a)
modify1(&a)
fmt.Println(a)
}  

输出

a= 100
b= 0xc0420140e0
100
10

  

指针

Go 拥有指针。指针保存了值的内存地址。

类型 *T 是指向 T 类型值的指针。其零值为 nil

var p *int

& 操作符会生成一个指向其操作数的指针。

i := 42  
p = &i  //设置p的内存地址

* 操作符表示指针指向的底层值。

fmt.Println(*p) // 通过指针 p 读取 i
*p = 21 // 通过指针 p 设置 i

这也就是通常所说的“间接引用”或“重定向”。

与 C 不同,Go 没有指针运算。

例一

package main

import "fmt"

func swap(a, b int)  {
tmp := a
a = b
b = tmp
} func main() {
first := 10
second := 20
swap(first, second) //这里执行的时候相当于传入了first1=10,second1=20,这个first1与first的内存地址不同,但是值相同,因为10为值类型,second1同理
fmt.Println("first=", first)
fmt.Println("second=", second)
}

输出  

first= 10
second= 20  

例二

package main

import "fmt"

func swap(a, b *int)  {
tmp := *a
*a = *b //交换a,b的指针的值
*b = tmp
} func main() {
first := 10
second := 20
swap(&first, &second) //传入指针
fmt.Println("first=", first)
fmt.Println("second=", second)
}  

输出

first= 20
second= 10

变量的作用域

1、在函数内部声明的变量叫局部变量,生命周期仅限于函数内部。

2、在函数外部声明的变量叫全局变量,声明周期作用于整个包,如果是大写的,则作用于整个程序

例一

package main

import "fmt"
var a = "G"
func n() {
fmt.Println(a) }
func m() {
a := "O" //重新声明一个变量a
fmt.Println(a)
} func main() {
n()
m()
n()
}

输出

G
O
G

  

例二

package main

import "fmt"
var a = "G"
func n() {
fmt.Println(a) }
func m() {
a = "O" //对全局变量a重新赋值
fmt.Println(a)
} func main() {
n()
m()
n()
}

输出  

G
O
O

例三

package main

import "fmt"

var a string

func f1()  {
a := "O"
fmt.Println(a)
f2()
} func f2() {
fmt.Println(a)
} func main() {
a = "G"
fmt.Print(a)
f1()
}  

输出

G
O
G

  

数据类型和操作符

1、字符串表示两种方式:

  1)""

  2)''  //byte类型

  3)``  //完全按照输入来输出

例一

package main

import "fmt"

func main()  {
var a byte ='c'
var str string = "hello \nworld"
var str2 string = `
fdsfdsf,
hello world \n
hello world
`
fmt.Printf("%c\n",a)
fmt.Println(str)
fmt.Println(str2)
}

输出

99
hello
world fdsfdsf,
hello world \n
hello world

  

练习

1、判断101-200之间有多少个素数,并输出所有素数

package main

import (
"math"
"fmt"
) func prime(n int) (res int) {
var list []int
var flag int
for i := 2; float64(i) <= math.Sqrt(float64(n)); i ++ {
flag ++
k := n % i
if k == 0 {
res = 0
break
}else {
list = append(list, i)
}
}
if len(list) == flag {
res = 1
}
return res
} func main() {
var count int
for j :=101; j <= 200; j++ {
res := prime(j)
if res == 1 {
fmt.Println(j)
count++
}
}
fmt.Printf("总数:%v个\n",count)
}  

输出

101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
总数:21个

  

2. 打印出100-999中所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字
立方和等于该数本身。例如:153 是一个“水仙花数”,因为 153=1 的三次
方+5 的三次方+3 的三次方。

package main

import (
"fmt"
"strconv"
) func flower(n int) (sum int) {
a := fmt.Sprintf("%v", n)
for i := 0; i < len(a); i ++ {
b := fmt.Sprintf("%c", a[i])
s, err := strconv.Atoi(b)
if err != nil {
fmt.Println("字符串转换成整数失败")
}
sum += s*s*s
}
return sum
} func main() {
for i :=100; i < 999; i ++ {
if flower(i) == i{
fmt.Println(flower(i))
}
}
}  

输出

153
370
371
407

  

3. 对于一个数n,求n的阶乘之和,即: 1! + 2! + 3!+…n!

package main

import "fmt"

func step(n int) (res int) {
if n == 0 {
res = 1
}else {
res = n*step(n-1)
}
return res
} func main() {
n := 3
var sum int
for i := 1; i <= n; i++ {
sum += step(i)
}
fmt.Println("sum=",sum)
}

 输出

sum= 9

  

  

go学习day2的更多相关文章

  1. NodeJS学习day2

    今天还是接着学习IO,主要方面是文件路径相关操作 练习代码如下: const fs = require('fs') // 执行C:\CS\Node.js>node .\day2\fsRoad.j ...

  2. Python学习-day2

    这周时间充裕,把第一周的两个作业登陆验证和三级菜单做完后又用零零散散的时间看完了第二周的课程,不得不说老男孩这个教育方式感觉还是不错的,其实说白了就是花钱找个人监督自己学习呗,而且还强行让我们养成一些 ...

  3. python学习day2

    一.模块初识 python模块 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用 ...

  4. python全栈学习--day2

    一.in的使用 说明:in有相当多的用处,比如判断,循环for 等. 实例一:in 操作符用于判断关键字是否存在于变量中 s = '男人john' print('男孩' in s) print('男孩 ...

  5. Python基础学习Day2

    一.格式化输出 需求格式化输出:姓名.年龄.工作.爱好 # 格式化输出 name = input('请输入用户名:') age = input('请输入年龄:') job = input('请输入你的 ...

  6. Python爬虫学习 - day2 - 站点登陆

    利用Python完成简单的站点登陆 最近学习到了爬虫,瞬时觉得很高大上,想取什么就取什么,感觉要上天.这里分享一个简单的登陆抽屉新热榜的教程(因为它不需要验证码,目前还没有学会图像识别.哈哈),供大家 ...

  7. Pyhton学习——Day2

    Python开发IDE(工具)Pycharm.eclipse1.循环while 条件 #循环体 #条件为真则执行 #条件为假则执行break用于退出所有循环continue用于退出当前循环 2.Pyc ...

  8. HTML学习----------DAY2第五节

    属性为 HTML 元素提供附加信息. HTML 属性 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息. 属性总是以名称/值对的形式出现,比如:name="value& ...

  9. HTML学习----------DAY2第四节

    HTML 文档是由 HTML 元素定义的. HTML 元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签(opening ...

  10. Linux学习Day2:安装RedHat Linux和新手必须掌握的命令

    今天是Linux线上培训的第二天,主要是Linux环境的安装和几个常见命令的学习,具体如下: 一.RHEL7系统的安装 首先是VMware WorkStation 12.0软件的安装,然后是RHEL7 ...

随机推荐

  1. 2018.10.25 CCSP马拉松摸铜归来

    24号体测跑50+1000米. 50米抢跑被罚重跑???然后老年人就只能吊着一口仙气跑第二次50米.然后跑1000米,然后再到宿舍收拾行李赶往地铁站,然后再冲到火车站...(卒) 宾馆,三人挤入二人房 ...

  2. PS学习之动态表情制作

    准备素材 1. 2. 3. 4. 最后效果图: 在PS中打开四个图片 另外新建一个文件 用魔棒工具抠图 点击白色位置 右键选择反向 右键人物 选择拷贝的图层 重复,将四个图片扣好 拖到新建的文件里 如 ...

  3. hdu2594 Simpsons’ Hidden Talents LCS--扩展KMP

    Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had.Marge ...

  4. LG4196 [CQOI2006]凸多边形

    题意 题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入输出格式 输入格式: 第一行有一个整数n,表示凸多边形的个数, ...

  5. mysql 之mvcc多版本控制

    MVCC是multiversion concurrency control的缩写,提供MySQL事物隔离级别下无锁读,例如一个事物在执行update等修改数据的sql,并未提交时其他事物进行数据读取是 ...

  6. shell-url-decode

    查询每个小时的clk ,然后获取对应的字段 #!/bin/bash urldecode(){ echo -e "$(sed 's/+/ /g;s/%\(..\)/\\x\1/g;')&quo ...

  7. MySQL之高可用MHA部署

    先说一下大概原理 虚拟机A  ip为10.0.3.92           作为master 虚拟机B  ip为10.0.3.102  作为slave1 虚拟机C  ip为10.0.3.103  作为 ...

  8. nginx日志格式配置

    我一向对日志这个东西有些许恐惧,因为在分析日志是需要记住不同服务器日志的格式,就拿提取ip这一项来说,有的服务器日志是在第一列,有的是第二列或则第三列等等.知道今天我才发现,日志格式是可以自定义配置的 ...

  9. Centos6.7 64位安装配置kvm虚拟化

    首先,需要我们的cpu支持虚拟化,有的机器支持但是并未在bios开启,这个需要事先开启. 1. Dell R710安装centos6.7 64位 ,Dell R710在开机后按F2进入BIOS,Pro ...

  10. CSVN(SVN)命令入门及使用过程中遇到的错误问题汇总

    首先进入web管理界面新建一个版本库 新建一个文件text svn add text #如果提示错误,在后面增加–force svn ci -m 'add text' #如果提示错误,将csvn下的目 ...