Day02 Go语言流程控制数组切片

Posted 澐湮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day02 Go语言流程控制数组切片相关的知识,希望对你有一定的参考价值。

上午01 上节回顾

day01回顾:

Go:静态编译型语言

Go:极高的开发效率 同时很好的运行性能,高并发能力

安装编译器

go env

GOROOT=D:\\Go

GOPATH=D:\\GoWork

GOPATH下目录结构

bin

pkg

src\\s9\\day01

文件名可以不叫main.go

go执行命令

  方式1 go build -o 自定义可执行文件名

    调用可执行文件

  方式2 go run go程序文件名.go

基本语法:

变量和变量赋值

方式1: 先声明再赋值

var 变量名 变量类型

var x int 开辟空间,空间已确定

x = 100

方式2:声明并赋值

var y = 200

方式3: 简易赋值

z:=300

方式4: 多个变量的赋值:

var a,b,c = 100,hello,true

匿名变量

var _,b,c = 100,hello,true

变量命名规范

强制 必须数字、字母、下划线

不能以数字开头

不能是保留字:赋予特定功能的字

建议:驼峰,见名知意,区分大小写

语句分隔符:

换行和分号,推荐换行

注释:

// 单行, /*多行*/

基本数据类型:(值类型)

int float 进制

12 3.14

bool

true false

string

“”

冯诺依曼 存储式编程

根据存储分两类:

  值类型   有默认值

  引用类型

package main

import "fmt"

func main() 
   var x int  // 开辟空间,有默认值
   fmt.Println(x)
   x = 10
   fmt.Println(x)

   var s string
   fmt.Println(s)
   fmt.Printf("%#v\\n",s)

   var b bool
   fmt.Println(b)

零值:每一个数据类型下有且只有一个布尔值为false的值,这个值称为这个类型的零值

  整型:0

  字符串:“”

  布尔值:false

  当声明一个值类型变量未赋值时,零值会作为该变量的默认值

字符串:

双引号标识

var s=hello world

len() 字符长度

基本操作:

索引: s[2]

切片:s[2:4] //顾头不顾尾,字符串切出来还是字符串

转义符号: \\n \\\\

反引号: `` 多行打印

内置方法 :字符串  .方法()

strings.ToUpper(s)
strings.ToLower(s)


strings.Contains(s)
Strings.HasPrefix(s)
strings.HasSuffix(s)


strings.Trim(s,” “)  // 返回字符串
 
strings.Index(s,“world”)  查索引   //未找到,返回-1
strings.LastIndex(s,”l”)  从后往前查  


var s = “1 2 3 4 5”
var arr =strings.Split(s,” “) //返回值是一个数组 [“1”,”2”,”3”,”4”,”5”]
strings.Join(arr,”+”) //传入数组

  

 ? rootroot hello root 咋去除?

只去除行首第一个root

	var str1 = "rootroot test root"
	var str2 =strings.TrimPrefix(str1,"root")
	fmt.Println(str2)

运算符:

科学计算运算符

fmt.Println(1+1)
fmt.Println(12%2 == 0)

奇数 偶数

运算符: 自增 ++ 仅限于自加

赋值运算

//运算符 ++
var a = 10
//a=11
//a = a+1
a+=1 //a=a+1
fmt.Println(a)

逻辑运算符&&  || 非!

类型转换:

x:=strconv.Itoa(112)

y,_:=strconv.Atoi(2000)

上午02 流程控制语句

分两类

  分支语句

  循环语句

分支语句:

  单分支

  双分支

  多分支

if 分支语句

  if 语法格式:

  单分支

    if 表达式

      语句体

    

  双分支

    if 表达式

      语句体

    else

      语句体

    

  多分支

    if 表达式

      语句体

    else if 表达式

      语句体

    else

      语句体

    

  最后的else不是必须的

示例

goland小技巧:

    Ctrl+Alt+L 格式化代码  

    Shift+Tab 左移

package main

import "fmt"

func main() 
/* var user string
   var pwd string
   fmt.Print(">>>")
   fmt.Scanln(&user, &pwd)*/

   //单分支语句
/* if user == "rain" && pwd == "123" 
      fmt.Println("登录成功")
   */

   //双分支语句
/* if user == "rain" && pwd == "123" 
      fmt.Println("登录成功")
   else
      fmt.Println("用户名或者密码错误!")
   */

   //多分支语句
   var score int
   fmt.Scanln(&score)

   if score>100 || score <0 
      fmt.Println("输入的成绩应该在0-100之间")
   else if score>=90 
      fmt.Println("成绩优秀")
   else if score >=80 
      fmt.Println("成绩良好")
   else if score >=60 && score<80 
      fmt.Println("成绩及格")
   else 
      fmt.Println("成绩不及格")
   

   fmt.Println("OK")

switch语句

只做比对

switch 变量 
case 具体值:
  语句A
case 值:
  语句B
case 值:
  语句C
default:
    ...

可以没有default语句块

示例

package main

import "fmt"

func main() 
   var week int
   fmt.Scanln(&week)

   switch week 
   case 0 :
      fmt.Println("星期日")
   case 1:
      fmt.Println("星期一")
   case 2:
      fmt.Println("星期二")
   case 3:
      fmt.Println("星期三")
   case 4:
      fmt.Println("星期四")
   case 5:
      fmt.Println("星期五")
   case 6:
      fmt.Println("星期六")
   

空间换时间,建个表查

对比

1、switch比if else更为简洁

2、执行效率更高

3、到底使用哪一个选择语句,代码环境有关,如果是范围取值,则使用if else语句更为快捷;如果是确定取值,则使用switch是更优方案。

练习题:通过输入范围,判断星座

package main

import (
   "fmt"
   "strconv"
   "strings"
)

func main() 
   var brith string
   fmt.Printf("请输入生日年月日,格式2022-01-16: ")
   fmt.Scanln(&brith)
   brithSlice:=strings.Split(brith,"-")
   month :=brithSlice[1]
   day :=brithSlice[2]
   var date =month+"."+ day
   dateFloat,_ :=strconv.ParseFloat(date,64)
   if dateFloat >=3.21 && dateFloat<4.19 
      fmt.Println("白羊座")
   else if dateFloat>=4.19 && dateFloat<5.20 
      fmt.Println("金牛座")
   else
      fmt.Println("xx座")
   

另外的思路

var brith string
fmt.Printf("请输入生日年月日,格式2022-01-16: ")
fmt.Scanln(&brith) //2000-03-16 ---> ["2000" "3" "16"]
var arr = strings.Split(brith,"-")
fmt.Println("arr",arr)
fmt.Println("month",arr[1]) //"03"
fmt.Println("day",arr[2]) //"16"

var arr2 = []stringarr[1],".",arr[2]
fmt.Println(strings.Join(arr2,"")) //返回字符串,还需要再转float型

Join输入切片类型 注意[]string

var arr2 = []stringarr[1],".",arr[2]
fmt.Println(strings.Join(arr2,"")) //返回字符串,还需要再转float型

省去变量直接输出

brithSlice:=strings.Split(brith,"-")
var brithStr = brithSlice[1]+"."+brithSlice[2]
brithFloat,_:=strconv.ParseFloat(brithStr,64)
fmt.Println(brithFloat)

测试结果

请输入生日年月日,格式2022-01-16: 2021-03-22
3.22
白羊座

下午01 循环 

多分支语句练习

// for 循环

for 表达式

  语句体

有限循环三要素:

1、声明初始化变量

2、比较表达式

3、步进语句

package main

import "fmt"

func main() 
   fmt.Println("hello world")
   fmt.Println("hello world")
   fmt.Println("hello world")

无限循环

退不出循环了

D:\\GoWork\\src\\gitee.com\\zhutao2014\\s9\\day02\\05循环语句\\main.go

 

package main

import "fmt"

func main() 
   //无限循环
   for true 
      var user string
      var pwd string
      fmt.Print(">>>")
      fmt.Scanln(&user, &pwd)
      if user == "rain" && pwd == "123" 
         fmt.Println("登录成功")
      else
         fmt.Println("用户名或者密码错误!")
      
   

有限循环(三要素)

package main

import "fmt"

func main() 
    //有限循环 1、声明初始化变量 2、比较表达式  3、步进语句
   var n = 0
   for n<10 
      //fmt.Println("hello world")
      fmt.Println(n)
      n++
   

课堂练习1 + ...+ 100

package main

import "fmt"

func main() 
//课堂练习
   var n=1
   var sum = 0
   for n<101 
      sum+=n
      n++
   
   fmt.Println(sum)

打断点

 第二次 点击执行蓝条

 练习打印 1-100中所有的偶数

package main

import "fmt"

func main() 
    var n = 0
   for n < 101 
      if n%2 == 0 
         fmt.Println(n)
      
      n++
   

三要素for循环

package main

import "fmt"

func main() 
   var n = 1  //初始化变量
   for n < 101  //比较表达式
      fmt.Println(n)
      n++    //步进语句
   
   
   //三要素循环
   for n4:=1;n4<100;n4++ 
      fmt.Println(n)
   

退出 break和continue

1、正常退出

2、条件退出

breakcontinue

break退出整个循环

continue退出当次循环

练习思考:打印0-88 一直打印 88

    //打印0-88 一直打印 88
   var a = 0
   for a<100 
      fmt.Println(a)
      if a == 88 
         continue
      
      a++
   

循环嵌套练习

下午02  容器数据类型

数组

数组声明

声明语法

var 数组名 [元素数量]元素类型

package main

import (
   "fmt"
   "reflect"
)

func main() 
   // 数组 先声明 再赋值
   var arr [3]int     //数组是一个值类型
   fmt.Println(arr) // [0 0 0]
   //支持索引和切片
   fmt.Printf("%d %p\\n",arr,&arr)
   fmt.Println(arr[0],&arr[0])
   fmt.Println(arr[1],&arr[1])
   fmt.Println(arr[2],&arr[2])
   arr[0]=10
   arr[1]=11
   arr[2]=12
   //打印类型
   fmt.Println(arr,reflect.TypeOf(arr))

数组赋值

package main

import (
   "fmt"
   "reflect"
)

func main() 
    //声明并赋值
   var names = [3]string"yuan","rain","alvin"
   fmt.Println(names) //[yuan rain alvin]
   //不限长赋值
   var names2 = [...]string"yuan","rain","alvin","eric"
   fmt.Println(names2,reflect.TypeOf(names2)) //[yuan rain alvin]
   //索引赋值
   var names3 = [3]string0:"张三",2:"王五"
   fmt.Println(names3,len(names3))

遍历数组 3种

    //循环数组
   var names=[]string"yuan","rain","alvin","eric"
   //for i:=0;i<len(names);i++
   // fmt.Println(names[i])
   //
   //range循环
   //for i:=range names 
   // fmt.Println(i,names[i])
   //

   for i,v:=range names 
      fmt.Println(i,v)
   

练习 a开头的 改成纯大写的 

package main

import (
   "fmt"
   "strings"
)

func main() 
   //range 循环
   var names = [...]string"yuan","rain","alvin","eric","alex"
   for i:=range names 
      //if strings.HasPrefix(names[i],"a") 
      // names[i]=strings.ToUpper(names[i])
      //
      if names[i][0] == \'a\' 
         names[i]=strings.ToUpper(names[i])
      
   
   fmt.Println(names)

range遍历出索引和值 

package main

import (
   "fmt"
   "strings"
)

func main()  
   //range 循环
   var names = [...]string"yuan","rain","alvin","eric","alex"
   for i,name:=range names 
      if strings.HasPrefix(name,"a") 
         names[i]=strings.ToUpper(name)
      
   
   fmt.Println(names)


打印结果:
[yuan rain ALVIN eric ALEX]

 切片

创建切片

package main

import (
   "fmt"
   "reflect"
)

func main() 
   var arr = [5]int10,11,12,13,14
   var s1 = arr[1:4]
   fmt.Println(s1,reflect.TypeOf(s1)) //[11 12 13] []int

   var s2 = arr[2:5]
   fmt.Println(s2,reflect.TypeOf(s2)) //[12 13 14]
   fmt.Println(":::",s1,s2)


打印结果
[11 12 13] []int
[12 13 14] []int
::: [11 12 13] [12 13 14]

切片的地址:

 

 

 

 

 修改切片

package main

import (
   "fmt"
   "reflect"
)

func main() 
   var arr = [5]int10,11,12,13,14
   var s1 = arr[1:4]
   fmt.Println(s1,reflect.TypeOf(s1)) //[11 12 13] []int

   var s2 = arr[2:5]
   fmt.Println(s2,reflect.TypeOf(s2)) //[12 13 14] []int
   //arr[2] = 120
   fmt.Println(":::",s1,s2)  //::: [11 12 13] [12 13 14]

   //从切片上切
   //var s3 = s2[0:5] //panic: runtime error: slice bounds out of range [:5] with capacity 3
   var s3 = s2[0:2]
   s3[0]=1000
   fmt.Println(s3)  //[1000 13]
   fmt.Println(":::",s1,s2,s3) //::: [11 1000 13] [1000 13 14] [1000 13]

打印长度和容量

package main

import (
   "fmt"
   "reflect"
)

func main() 
   var arr = [5]int10,11,12,13,14
   var s1 = arr[1:4]
   var s2 = arr[2:5]
   fmt.Println(":::",s1,s2) //::: [11 12 13] [12 13 14]
   var s3 = s2[0:2]
   s3[0]=1000
   fmt.Println(":::",s1,s2,s3) //::: [11 1000 13] [1000 13 14] [1000 13]
   //打印长度和容量
   fmt.Println(":::",s1,len(s1),cap(s1))
   fmt.Println(":::",s2,len(s2),cap(s2))
   fmt.Println(":::",s3,len(s3),cap(s3))


打印结果:
::: [11 12 13] [12 13 14]
::: [11 1000 13] [1000 13 14] [1000 13]
::: [11 1000 13] 3 4
::: [1000 13 14] 3 3
::: [1000 13] 2 3

练习题

package main

import (
   "fmt"
   "reflect"
)

func main() 
   var a=[...]int1,2,3,4,5,6
   a1:=a[0:3] //[1 2 3]       3 6
   a2:=a[0:5] //[1 2 3 4 5]   5 6
   a3:=a[1:5] //[2 3 4 5]     4 5
   a4:=a[1:] //[2 3 4 5 6]    5 5
   a5:=a[:] // [1 2 3 4 5 6]  6 6
   a6:=a3[1:2] //[3]          1 4
   fmt.Println("===")
   fmt.Println(a1,len(a1),cap(a1))
   fmt.Println(a2,len(a2),cap(a2))
   fmt.Println(a3,len(a3),cap(a3))
   fmt.Println(a4,len(a4),cap(a4))
   fmt.Println(a5,len(a5),cap(a5))
   fmt.Println(a6,len(a6),cap(a6))


下午03

切片声明

切片声明3种方式(从数据切片,使用make创建,使用append生成新切片)

1 从数据切片

package main

import (
   "fmt"
   "reflect"
)

func main() 
   var arr = [5]int10,11,12,13,14
   fmt.Println(arr,reflect.TypeOf(arr)) //[10 11 12 13 14] [5]int
   var s1 = arr[1:4]
   fmt.Println(s1,reflect.TypeOf(s1)) //[11 12 13] []int

   var s2 = arr[2:5]
   fmt.Println(s2,reflect.TypeOf(s2)) //[12 13 14]
   //arr[2] = 120
   fmt.Println(":::",s1,s2) //::: [11 12 13] [12 13 14]

2使用make函数

package main

import "fmt"

func main() 

   //切片:引用类型,当只声明,未赋值,不开辟空间
   var s3 []int
   //s3[0] = 10
   fmt.Println(s3)

   //make函数
   var s4 = make([]int,3,5)
   fmt.Println(s4)
   s5:=s4[0:5]
   fmt.Println(s5)


打印结果
[]
[0 0 0]
[0 0 0 0 0]

切片扩容 append

package main

import "fmt"

func main() 
   var s []int
   //s1:=append(s,1)
   //s1:=append(s,1,2,3,4,5)
   s1:=append(s,[]int1,2,3,4,5...)
   fmt.Println(s1)


打印结果
[1 2 3 4 5]

append案例1

package main

import "fmt"

func main()    
   //案例1
   a:=[]int12,23,34
   fmt.Println(len(a))
   fmt.Println(cap(a))
   
   b:=append(a,45)
   fmt.Println(b)
   
   a[0]=1000
   fmt.Println(a)
   fmt.Println(b)


打印结果:  注意:b扩容后,底层数据已经变化,a和b底层已经不是同一个数组
3
3
[12 23 34 45]
[1000 23 34]
[12 23 34 45]

append案例2

package main

import "fmt"

func main() 
   var s []int
   //s1:=append(s,1)
   //s1:=append(s,1,2,3,4,5)
   s1:=append(s,[]int1,2,3,4,5...)

   fmt.Println(s1)
   //案例2
   c:=make([]int,3,5)
   d:=append(c,100)
   fmt.Println(c,d)
   c[0] = 1000
   fmt.Println(d)


打印结果:
[0 0 0] [0 0 0 100]
[1000 0 0 100]

图解

面试题

package main

import "fmt"

func main() 
   //面试题
   arr := [4]int10,20,30,40
   s1:=arr[0:2] //[10 20]
   s2:=s1 //[10 20]
   s3:=append(append(append(s1,1),2),3)
   //s3 [10 20 1 2 3]
   s1[0]=1000
   fmt.Println(s2[0],s2) //[1000 20]
   fmt.Println(s3[0],s3) //[10 20 1 2 3]

练习题

思考:这样写可以不?

package main

import "fmt"

func main() 
   var a = []int1,2,3,4
   s1:=a[:2] //[1,2]
   s2:=a[2:] //[3,4]
   fmt.Println(append(append(s1,100,),s2...))
   //[1,2,100] 此时数组a为[1,2,100,4]   切片s2 已经为[100,4]
   //[1,2,100,3,4] x 答案为[1 2 100 100 4]

作业

(1) 计算 1 - 2 + 3 - 4 + ... + 99 中除了88以外所有数的总和?

(2) 1+2!+3!+4!+……+10!的和

(3) 程序随机内置一个位于一定范围内的数字作为猜测的结果,由用户猜测此数字。用户每猜测一次,由系统提示猜测结果:太大了、太小了或者猜对了,直到用户猜对结果或者猜测次数用完导致失败。设定一个理想数字比如:66,让用户三次机会猜数字,如果比66大,则显示猜测的结果大了;

如果比66小,则显示猜测的结果小了;只有等于66,显示猜测结果正确,退出循环。最多三次都没有猜测正确,退出循环,并显示都没猜对,继续努力

(4) 计算索引为10的斐波那契数列对应的值(斐波那契数列指的是一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和)

(5) 打印菱形小星星

作业2 阶乘

思路:乘法优先级高,

1、定义初始乘积为1,先算1*2*3*...*10的积

2、定义初始和为0,再把乘积相累加。

package main

import "fmt"

func main() 
   //1 - 10的阶乘和

   sum :=0
   product:=1
   for i:=1;i<11;i++
      //1 求乘积
      product*=i
      //fmt.Println(product)
      //2 求和
      sum+=product
   
   fmt.Println(sum)

 作业3 猜数字

package main

import (
   "fmt"
   "strconv"
)

func main() 
   //2 猜数字,猜对退出
   var num = 66
   for i:=0;i<3;i++ 
      var choice string
      fmt.Print("输入1-100数字:")
      fmt.Scanln(&choice)
      choiceInt,err:=strconv.Atoi(choice)
      if err !=nil 
         fmt.Println("非法输入")
      else if choiceInt > num 
         fmt.Println("猜大了")
      else if choiceInt < num 
         fmt.Println("猜小了")
      else if choiceInt == num 
         fmt.Println("恭喜你,猜对了")
         break
      
      if i==2 
         fmt.Println("都没猜对,继续努力")
      
   

改进

package main

import (
   "fmt"
   "strconv"
)

func main() 
   //2 猜数字,猜对退出
   var num = 66
   for i:=0;i<3;i++ 
      var choice string
      fmt.Print("输入1-100数字:")
      fmt.Scanln(&choice)
      choiceInt,err:=strconv.Atoi(choice)
      if err !=nil 
         fmt.Printf("非法输入,已输入%d次\\n",i+1)
      else if choiceInt > num 
         fmt.Printf("猜大了,已输入%d次\\n",i+1)
      else if choiceInt < num 
         fmt.Printf("猜小了,已输入%d次\\n",i+1)
      else if choiceInt == num 
         fmt.Println("恭喜你,猜对了")
         break
      
      if i==2 
         fmt.Println("都没猜对,继续努力")
      
   

作业4 斐波那契数列

0项是0,第1项是第一个1

package main

import "fmt"

func main() 
/*  slice := []int0, 1
   for i := 0; i <= 11; i++ 
      if i == 0 
         slice = []int0
         continue
       else if i == 1 
         slice = []int0, 1
         continue
       else if i >= 2 
         slice = append(slice, slice[i-1]+slice[i-2])
      
   
   fmt.Println(slice)*/
    slice := make([]int, 11)
   for i := 0; i < 11; i++ 
      slice[1]=1
      slice[2]=1
      if i>=2 
         slice[i]=slice[i-1]+slice[i-2]
      
   
   fmt.Println(slice)

 其他想法

package main

import "fmt"

func main() 
   var s = make([]int,3,5)
   fmt.Println(s)
   s1:=s[1:4]
   fmt.Println(s1)
   s[2]=10
   fmt.Println(s,s1)

 

 

以上是关于Day02 Go语言流程控制数组切片的主要内容,如果未能解决你的问题,请参考以下文章

Go语言学习之路目录

Go语言基础:运算符_流程控制循环_数组_切片

Go语言基础:运算符_流程控制循环_数组_切片

Go 语言入门三部曲:能看懂 Go 语言

好好学习GO语言,GO语言基础学习目录★√

好好学习GO语言,GO语言基础学习目录★√