一、文件名 关键字 标识符

  1. 所有go源码都以.go结尾
  2. 标识符以字母或下划线开头,大小写敏感
  1. a.boy b.Boy c.a+b d.0boy
  2.  
  3. e._boy f.=_boy g._

  以上变量c、d、f的命名是不正确的

  _是特殊标识符,用来忽略结果

  3.一些go保留的关键字

二、go程序的基本结构

  1. 任何一个文件都隶属于一个包
  2. 引入包
  1. import (
  2. "fmt"
  3. "os"
  4. )

  

  3.go可执行文件 package main,有且仅有一个入口函数main

  4.包中函数调用

    同一个包中函数,直接调用

    不同包中函数,通过包名+.+函数名调用

  5.包访问控制规则

    大写意味着这个函数/变量是可导出的

example1:

给定一个数N,求所有两两相加等于N的组合

例如n=5

0+5=5

1+4=5

2+3=5

3+2=5

4+1=5

5+0=5

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func sum(n int) {
  8. for i := 0; i <= n; i++ {
  9. fmt.Printf("%d+%d=%d\n", i, n-i, n)
  10. }
  11. }
  12.  
  13. func main() {
  14. sum(10)
  15. }

example2:

一个程序包含两个包add、main,其中add包中有两变量Name,age,main包中如何访问Name,age?

add包中add.go

  1. package add
  2.  
  3. var Name string = "tony"
  4. var age int = 10

main包中main.go

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "go_dev/day2_practice/example2/add"
  6. )
  7.  
  8. func main() {
  9. fmt.Println("Name=", add.Name)
  10. fmt.Println("age=", add.age)
  11. }

这样执行是报错的,因为add.go中的age变量小写,私有,别的包中不能引用

example3:引用包的时候名字太长,用别名

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. a "go_dev/day2_practice/example2/add"
  6. )
  7.  
  8. func main() {
  9. fmt.Println("Name=", a.Name)
  10.  
  11. }

example4:init函数,自动被go运行框架调用

执行顺序:

初始化全局变量-->init函数-->main函数

三、函数声明和注释

函数声明:func 函数名 (参数列表) (返回值列表) { }

注释://单行注释   /* */多行注释

example5:计算两个数的和

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func add(a int, b int) int {
  8. result := a + b
  9. return result
  10. }
  11.  
  12. func main() {
  13. result := add(100, 200)
  14. fmt.Println("sum=", result)
  15. }

四、常量

常量使用const修饰,代表只读,不能修改

const只能修饰bool,number,string

语法: const identifier [type] = value,其中type可以省略

定义常量优雅的写法

  1. const(
  2. a = 0
  3. b = 1
  4. c = 2
  5. )
  6.  
  7. const(
  8. a = iota
  9. b //1
  10. c //2
  11. )

example6:

定义两常量Female=2,Man=1,获取当前时间的秒数,如果能被female整除,打印female,否则man

五、变量

语法  var identifier type

  1. var a int
  2. var b string
  3. var c string = "hello world"
    var(
      a int //默认0
      b string //默认空
      c bool  //默认false
    )

变量值引用类型和引用类型

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

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

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func swap(a int, b int) {
  6. tmp := b
  7. b = a
  8. a = tmp
  9. return
  10. }
  11.  
  12. func main() {
  13. first := 4
  14. second := 3
  15. swap(first, second)
  16. fmt.Println("first=", first)
  17. fmt.Println("second=", second)
  18. }

运行输出first=4,second=3。执行到swap(first,second)时,把first和second复制一份进去,不影响main里面的first,second

example7:交换两个整数的值,a=3,b=4,交换后,a=4,b=3

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func swap(a *int, b *int) {
  6. //交换地址指向的值
  7. tmp := *b
  8. *b = *a
  9. *a = tmp
  10. return
  11. }
  12.  
  13. func main() {
  14. first := 4
  15. second := 3
  16. swap(&first, &second) //传两个值的地址
  17. fmt.Println("first=", first)
  18. fmt.Println("second=", second)
  19. }

另一种方法,不用修改a,b地址指向的值

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func swap(a int, b int) (int, int) {
  8. return b, a
  9. }
  10.  
  11. func main() {
  12. first := 4
  13. second := 3
  14. first, second = swap(first, second)
  15. fmt.Println("first=", first)
  16. fmt.Println("second=", second)
  17. }

六、变量的作用域

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

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

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. var a = "G"
  8.  
  9. func main() {
  10. n()
  11. m()
  12. n()
  13. }
  14.  
  15. func n() {
  16. fmt.Println(a)
  17. }
  18.  
  19. func m() {
  20. a := "O" //函数内部重新定义a变量并赋值
  21. fmt.Println(a)
  22. }

上面的例子输出GOG

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. var a = "G"
  8.  
  9. func main() {
  10. n()
  11. m()
  12. n()
  13. }
  14.  
  15. func n() {
  16. fmt.Println(a)
  17. }
  18.  
  19. func m() {
  20. a = "O" //对全局变量a重新赋值
  21. fmt.Println(a)
  22. }

上面的例子输出GOO

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. var a string
  8.  
  9. func main() {
  10. a = "G"
  11. fmt.Println(a)
  12. f1()
  13. }
  14.  
  15. func f1() {
  16. a := "O"
  17. fmt.Println(a)
  18. f2()
  19. }
  20.  
  21. func f2() {
  22. fmt.Println(a)
  23. }

输出GOG

七、数据类型、操作符

1、逻辑操作符:==、!=、< 、>

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. a := 10
  9. if a > 5 {
  10. fmt.Println(a)
  11. }
  12. }

2、数学操作符:+、-、*、/等

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. a := 10
  9. b := a + 10
  10. fmt.Println("b=", b)
  11. }

example:使用math/rand生成10个随机整数,10个小于100的随机整数以及10个随机浮点数

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. "time"
  7. )
  8.  
  9. func init() {
  10. rand.Seed(time.Now().Unix())
  11. }
  12.  
  13. func main() {
  14. for i := 0; i < 10; i++ {
  15. fmt.Println(rand.Int())
  16. }
  17. for i := 0; i < 10; i++ {
  18. fmt.Println(rand.Intn(100))
  19. }
  20. for i := 0; i < 10; i++ {
  21. fmt.Println(rand.Float32())
  22. }
  23. }

字符类型:var a byte

字符串类型:var str  string

字符串的两种表示方式:

  (一)双引号 (二)反引号

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var str string = "hello world"
  9. var str1 string = `
  10. 床前明月光
  11. 疑是地上霜`
  12. fmt.Println(str)
  13. fmt.Println(str1)
  14. }

字符串常见操作(切片,反转,拼接)

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func reverse(str string) string {
  8. var result string
  9. strLen := len(str)
  10. for i := 0; i < strLen; i++ {
  11. result = result + fmt.Sprintf("%c", str[strLen-i-1])
  12. }
  13. return result
  14. }
  15.  
  16. func main() {
  17. str1 := "hello"
  18. str2 := "world"
  19. // str3 := str1 + " " + str2 字符串拼接
  20. str3 := fmt.Sprintf("%s %s", str1, str2) //字符串拼接
  21. fmt.Println("str3=", str3)
  22. n := len(str3) //长度
  23. fmt.Println("len(str3)=", n)
  24. str4 := str3[0:5] // 切片
  25. fmt.Println("str4=", str4)
  26. str4 = str3[6:]
  27. fmt.Println("str4=", str4)
  28.  
  29. result := reverse(str3) //字符串反转
  30. fmt.Println("reverse=", result)
  31. }

练习:

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

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var len int
  9. for i := 101; i < 200; i++ {
  10. var flag bool = true
  11. for j := 2; j < i; j++ {
  12. if i%j == 0 {
  13. flag = false
  14. }
  15. }
  16. if flag {
  17. len += 1
  18. fmt.Println(i)
  19. }
  20. }
  21. fmt.Println("素数个数", len)
  22. }

  

2、打印出100-999中所有的水仙花数(一个三位数,其各位数字立方和等于该数本身)

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func isNumber(n int) bool {
  8. var i, j, k int
  9. i = n % 10
  10. j = (n / 10) % 10
  11. k = (n / 100) % 100
  12. sum := i*i*i + j*j*j + k*k*k
  13. return sum == n
  14. }
  15.  
  16. func main() {
  17. var n int
  18. fmt.Scanf("%d", &n)
  19. if isNumber(n) == true {
  20. fmt.Println(n, "is shuixianhua")
  21. } else {
  22. fmt.Println(n, "is not shuixianhua")
  23. }
  24. }

  

3、对于一个数n,求n的阶乘之和

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func sum(n int) uint64 {
  8. var s uint64 = 1
  9. var sum uint64
  10. for i := 1; i <= n; i++ {
  11. s = s * uint64(i)//前一个数的阶乘*当前数
  12. sum += s
  13. }
  14. return sum
  15. }
  16.  
  17. func main() {
  18. var n int
  19. fmt.Scanf("%d", &n)
  20. s := sum(n)
  21. fmt.Println(s)
  22. }

  

  

go 学习之路(二)的更多相关文章

  1. Redis——学习之路二(初识redis服务器命令)

    上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息   s ...

  2. zigbee学习之路(二)点亮LED

    一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...

  3. Android开发学习之路-二维码学习

    这个月装逼有点少了,为什么呢,因为去考软件射鸡师了,快到儿童节了,赶紧写篇博纪念一下逝去的青春,唔,请忽略这句话. 二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这 ...

  4. Python学习之路二

    今天主要学习了列表,python的列表真的事太强大了,由于内容比较多,今天就先简单的介绍一下新学的几个成员函数吧. 首先我们要了解list是一种序列类型,其构造方式有四种形式: (1)空列表 [] ( ...

  5. Spring学习之路二——概念上理解Spring

    一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...

  6. Spring Boot 学习之路二 配置文件 application.yml

    一.创建配置文件 如图所示,我们在resources文件夹中新建配置文件application.yml   结构图 二.一些基本配置 server: port: 8090 //配置端口 session ...

  7. .net core+Spring Cloud学习之路 二

    前言: 原本计划这次写一下搭建eureka群集.但是发现上次写的只是服务的注册,忘了写服务的发现,所以这次先把服务发现补上去. 我们基于上篇文章,再新建两个.net core web api项目,分别 ...

  8. react.js学习之路二

    看react.js对我来说真的不是难不难的问题,问题是我的思路太难转变了,真是坑死我了,react里面的坑也很多.算了,这些抱怨没啥用,记录一下今天学习的内容. 今天看了to-do-list经典示例 ...

  9. python学习之路 二 :基本数据类型

    本节重点 理解什么是变量? 掌握各种数据类型 理解可变类型和不可变类型 一.变量和常量 变量: 作用:存贮程序的中间结果在内存里,以备后边的程序调用 定义规范: 变量名只能是 字母.数字活下划线的任意 ...

  10. Java学习之路(二):关键字和变量,运算符

    关于关键字的一个概述 Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构,关键字不能用做变量名.方法名.类名.包名. Java常见的关键字 标识符 什么是标识 ...

随机推荐

  1. Sublime Text 3 安装 BracketHighlighter

    1 概述 由于最近在Sublime Text 3安装 BracketHighlighter遇到不少问题,其中踩了不少坑,因此总结下来,形成博客,希望能帮助更多的人 2 电脑环境 windows 10 ...

  2. HDU 5510:Bazinga(暴力KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5510 Bazinga Problem Description   Ladies and gentlemen, p ...

  3. golang 单元测试&&性能测试

    一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必 ...

  4. Bzoj 2839 集合计数 题解

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 495  Solved: 271[Submit][Status][Discuss] ...

  5. ~~Py2&Py3~~

    进击のpython python2 整型 int -- long(长整型) /获取的是整数 python3 整型 int /获取的是浮点数(小数) python2 print(range(1,10)) ...

  6. Connecting to the Network

    This lesson shows you how to implement a simple application that connects to the network. It explain ...

  7. Sending Operations to Multiple Threads_翻译

    The speed and efficiency of a long-running, data-intensive operation often improves when you split i ...

  8. ServiceFabric极简文档-5.1 编程模型选择

    项目中:actor用的服务是无状态服务:ASP.NET Core用的是无状态ASP.NET Core模板. ​

  9. TCP传输协议中如何解决丢包问题

    TCP在不可靠的网络上实现可靠的传输,必然会有丢包.TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题. 但是许多人有不同的 ...

  10. Spring Aware 到底是什么?

    通过如下前序两篇文章: Spring Bean 生命周期之"我从哪里来"? Spring Bean 生命周期之"我要到哪里去"? 我们了解了 Spring Be ...