go语言学习第一天。
直接上代码:主要内容为变量相关:
- 变量
- 变量命名
- 变量声明
- 变量赋值
- 常量及iota
- 数据类型:
- 整数
- 浮点数
- 复数
- 字符串
- 指针
- 结构体
- 作用域
- 数据的输入和输出
代码如下~
package main
import (
"fmt"
"time"
)
//var Age int
type Age int
//var age Age
type Score int
//type Score struct{
// age int
// name string
//}
func (s Score) Info() { //类的成员函数,叫方法
if s == 100 {
fmt.Println(" 优秀")
i := 10
fmt.Println("i=", i)
} else {
fmt.Println(" 垃圾")
//fmt.Println("i=", i)
}
}
//三种输入三种输出函数
func IO() {
//三种输出
fmt.Print("Hello") //不自动换行
fmt.Println("World") //自动换行
a := 10
b := 20 /*
fmt.Printf("%d,%d\n", a, b) //格式化的输出,不自动换行
//三种输入
//1 输入两个变量时,中间的分隔符可以是空格、tab 键和回车键。
fmt.Scan(&a, &b)
fmt.Println("a=", a, "b=", b)
//2 输入两个变量时,中间的分隔符可以是空格、Tab 键,回车键表示输入的结束
//回车以后的变量是之前的值,如果只定义未初始化,就是零值。
fmt.Scanln(&a, &b)
// fmt.Println("a=", a, "b=", b)*/
//3 格式化的输入,不自动换行
//输入分隔符和第一个参数中的分隔符要一致
//如果不用那个分隔符的话,就只赋值前面的一个数,后面的数是之前变量的值。
fmt.Scanf("%d,%d", &a, &b)
fmt.Println("a=", a, "b=", b)
}
//分支结构:打印月份的天数
func switchDemo() {
var month int
var Jan int = 1
fmt.Println("请输入月份")
fmt.Scan(&month)
switch month {
case Jan, 3, 5, 7, 8, 10, 12:
fmt.Println("31天")
case 4, 6, 9, 11:
fmt.Println("30天")
case 2:
fmt.Println("28天or29天")
default:
fmt.Println(" 月份输入错误!")
}
var month1 string
switch month1 {
case "Jan":
fmt.Println("31days")
}
}
//打印成绩的等级
func switchDemo2() {
fmt.Println(" 请输入您的成绩")
var score float32
fmt.Scan(&score)
switch {
case score <= 100 && score >= 90:
fmt.Println("A")
case score < 90 && score >= 80:
fmt.Println("B")
case score < 80 && score >= 60:
fmt.Println("C")
case score < 60 && score >= 0:
fmt.Println(score)
fmt.Println("D")
default:
fmt.Println("输入成绩有误")
}
}
func forDemo() {
s := 0
//1 完整表述
//for ( i := 1; i <= 100; i++ ) {//不能有小括号,有就报错
// for ; i <= 100; i++ {
// s += i
// }
//2 省略表达式1
//i := 1
// for ; i <= 100; i++ {
// s += i
// }
//3 省略表达式2
// i := 1
// for ; ; i++ {
// if i > 100 {
// break
// }
// s += i
// }
//4 省略所有表达式
i := 1
for {
if i > 100 { //表达式2
break
}
s += i //循环体
i++ //表达式3
}
fmt.Println(s)
}
//多元赋值与多赋值语句的区别
func manyValue() {
array := []int{1, 2, 3, 4, 5, 6, 7}
// for i, j := 0, len(array)-1; i < j; i, j = i+1, j-1 {
// array[i], array[j] = array[j], array[i]
// }
// fmt.Println(array)
i, j := 0, len(array)-1
for {
if i > j {
break
}
array[i], array[j] = array[j], array[i]
i++
j--
}
fmt.Println(array)
}
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
func continueDemo() {
for i := 0; i <= 100; i++ {
if i > 50 {
goto FINISH //goto 语句
}
if i%5 != 0 {
continue //结束本次循环
}
fmt.Print(i, " ")
}
fmt.Println("")
FINISH:
fmt.Println("")
}
//数组的演示
func ArrayDemo() {
//1 一般格式的声明
var arr1 [3]int = [3]int{1, 2, 3}
var arr2 [3]int
arr2 = [3]int{4, 5, 6}
fmt.Println(arr1, arr2)
//2 简短声明
arr3 := [3]int{7, 8, 9}
fmt.Println(arr3, len(arr3))
arr4 := [...]int{1, 23, 4, 5, 6, 7}
fmt.Println(arr4, len(arr4), arr4[3])
arr5 := []int{9: 10} //切片
fmt.Println(arr5, len(arr5))
arr6 := []int{1, 2, 3} //切片
arr6[0] = 10
fmt.Println(arr6)
//3 数组遍历
for i := 0; i < len(arr4); i++ {
fmt.Print(arr4[i], " ")
}
fmt.Println("")
for i, v := range arr4 {
fmt.Print(i, " ")
fmt.Println(v, " ")
}
fmt.Println("")
}
func SetValueByArray(arr [5]int) {
arr[0] = 100
}
func SetValueBySlice(slice []int) {
slice[0] = 100
}
func SliceDemo() {
//1 一般声明方式
var slice1 []int = []int{1, 2, 3, 4, 5}
fmt.Println(slice1)
//2 基于数组创建切片
arr := [...]int{1, 2, 3, 4, 5} //值类型
slice2 := arr[:] //引用类型,左闭右开
//slice2 := arr[:]
fmt.Println(arr, slice2)
//3 基于切片创建切片
slice3 := slice2[:]
fmt.Println(slice3)
arr[1] = 20
slice3[2] = 100
fmt.Println(arr, slice2, slice3)
fmt.Println(&slice3[4])
fmt.Println(&arr[4])
fmt.Println(&arr)
fmt.Println((&slice3))
fmt.Println("arr = ", arr)
//4 使用 make 创建切片
slice4 := make([]int, 3, 10)
slice5 := make([]int, 5, 10)
slice4 = []int{1, 2, 3, 4, 5}
//slice5 = []int{1, 2, 3, 4, 5}
//slice4[6] = 6
//申请新内存
//复制数据
//删除旧内存
//slice5[4] = 6
fmt.Println(slice4, len(slice4), cap(slice4))
fmt.Println(slice5, len(slice4), cap(slice5))
//5 追加元素
slice4 = append(slice4, 10, 20, 30)
slice5 = append(slice5, 1, 2, 3)
slice5 = append(slice4, slice5...)
fmt.Println(slice4, len(slice4), cap(slice4))
fmt.Println(slice5, len(slice4), cap(slice5))
fmt.Println(nil)
//6 切片复制
slice6 := []int{10, 20, 30}
slice7 := []int{1, 2, 3, 4, 5}
//copy(slice6, slice7)//多放少,有多少放多少、把7复制给6之后,有多少放多少,后面的就不放了。
copy(slice7, slice6) //少放多,有多少放多少、后面的就不变。
fmt.Println(slice7)
}
func mapDemo() {
//1 声明的一般语法
var map1 map[string]int
fmt.Println(map1)
fmt.Println(map1 == nil)
//map1["str1"] = 10//不允许
//2 创建映射
map1 = make(map[string]int, 10)
map1["str1"] = 10
map1["str2"] = 20
fmt.Println(map1)
//3 简短声明,并初始化
map2 := map[string]int{"str1": 10, "str2": 20, "str3": 30}
map2["str4"] = 40
fmt.Println(map2)
//4 删除元素
delete(map2, "str4")
delete(map2, "str4") //删除一个不存在的元素不会导致错误
fmt.Println(map2)
//5 使用元素
if v, ok := map2["str3"]; ok {
fmt.Println(v)
} else {
fmt.Println(" 不存在该值")
}
//6 遍历映射
for k, v := range map2 {
fmt.Println(k, v)
}
//不能对映射取地址。
fmt.Println(map2["str1"] /*, &map2["str1"]*/)
}
//五、函数的演示
// 1 一般函数的演示
func Max(a, b int) (int, int) {
if a > b {
return a, b
}
return b, a
}
//2 可变参数的函数
func Sum(nums ...int) int {
total := 0
for _, v := range nums {
total += v
}
return total
}
//3 多返回值
func AddSum(a, b int) (int, int) {
return a + b, a - b
}
func AddSum1(a, b int) (add int, sub int) {
add = a + b
sub = a - b
return add, sub
}
//4 使用递归实现阶乘
func Factorial(num int) int {
if num <= 1 {
return 1
} else {
return num * Factorial(num-1)
}
}
func Fibonacci(num int) int {
if num <= 2 {
return 1
} else {
return Fibonacci(num-2) + Fibonacci(num-1)
}
}
func main() {
var num int
fmt.Println("这是一个求斐波那契数列的函数")
fmt.Println("请输入您希望显示的斐波那契数列数量:")
fmt.Scan(&num)
t1 := time.Now()
fmt.Println(Fibonacci1(num))
elapsed := time.Since(t1)
fmt.Println("App elapsed:", elapsed)
//fmt.Println(Factorial(1))
//函数的多返回值演示
//fmt.Println(AddSum(5, 3))
//可变参数的函数演示
// fmt.Println(Sum(1, 2, 3, 4, 5))
// fmt.Println(Sum(1, 2, 3, 4, 5, 6, 7, 8, 9))
// slice := []int{1, 23, 4, 5}
// fmt.Println(Sum(slice...)) //打散
//一般函数演示
//fmt.Println(Max(10, 5))
//mapDemo()
//SliceDemo()
// arr := [...]int{1, 2, 3, 4, 5}
// //slice := arr[:]
// // SetValueByArray(arr) //数组是值传递,所以数据不变
// //SetValueBySlice(slice)
// SetValueBySlice(arr[:])
// fmt.Println(arr)
// //ArrayDemo()
//continueDemo()
// fmt.Println(Sunday)
// fmt.Println(Monday)
//manyValue()
//forDemo()
//switchDemo2()
//switchDemo()
//IO()
/*
var age Age = 18
fmt.Println(age)
var s Score = 100
fmt.Println(s)
var i int = 80
fmt.Println(i)
//type 定义类型,意味着Age 和 Score 是两个新的类型,虽然内存结构相同
//但是不能直接相互复制,需要强制转换类型(值)
//"一人(一个基础类型)千面(多个概念)"
age = Age(i) //需要赋值时需要强制类型转换
fmt.Println(age)
s.Info()
Score(i).Info() //调用函数也是需要强制类型转换
*/
}