常量
package main
import "fmt"
func main() {
//常量在编译期就确定结果 必须赋值 结果不可改变
//常量使用关键字const
const a string = "aaa"
const b = "bbb"
//定义多个常量
const (
c = 6
d = 7
)
fmt.Println(a, b, c, d)
//第一个常量必须赋值 其他的常量不赋值 等于第一个常量
const (
e = 1
f
g
)
fmt.Println(e, f, g)
//使用iota常量生成器 进行自增 默认是0
const (
q = iota
w
r
)
fmt.Println(q, w, r)
}
变量地址
package main
import "fmt"
func main() {
//变量地址
//变量的本质就是内存中一块数据的标记,把值存储到变量中,就是把值存储到内存中
//每次对变量重新赋值 就是在修改变量地址中的内容
//可以通过&变量名 获取变量的地址值
//重新创建一个非引用类型变量也会重新开辟内存地址
var a = 1
fmt.Println(&a)
a = 2
fmt.Println(&a)
fmt.Println(a)
b := a
fmt.Println(&b, &a)
}
指针类型
package main
import "fmt"
func main() {
//指针变量指向一个值的内存地址
//使用&变量 返回值就是一个指针类型
//使用var 变量名 *类型 声明指针类型变量
//声明指针不会开辟内存地址只是准备要指向内存某个空间
//而声明变量会开辟内存地址,准备放内容 所以指针类型变量 都是把一个变量的地址赋值给指针变量
//使用 *指针能够获取到内存地址的值 所以*指针就是直接使用变量是相同的
//应用指针可以实现多个地方操作同一个内存地址的值
var a = 1
//打印出*int 就是指针类型
fmt.Printf("%T", &a)
fmt.Println()
//也可以自定义指针类型 *类型
var b *int
c := 5
//把c的地址值 赋值给b
b = &c
//打印出相同的地址值 0xc00000a120 0xc00000a120
fmt.Println(b, &c)
//指针类型赋值
*b = 666
//这样*b c2个数据都发生了变化 都是666 指针类型必须加* 才能得到地址值
fmt.Println(*b, c)
}
new 函数
package main
import "fmt"
func main() {
//使用new 创建一个类型的指针
a := new(int)
//打印的是内存地址 指针地址 0xc00000a0e8
fmt.Println(a)
//使用*变量赋值
*a = 123
//打印a的值必须加*
fmt.Println(*a)
}
if 条件判断
package main
import "fmt"
func main() {
var age = 18
//可以不写括号
if age >= 18 {
//符合就打印
fmt.Println("年龄大于18")
}
if age < 18 {
fmt.Println("年龄小于18")
}
}
switch
package main
import "fmt"
func main() {
var age = 20
//如果age里面有条件判断 age 可以在switch 不写
switch {
case age > 10:
fmt.Println("年龄大于10")
case age < 5:
fmt.Println("年龄小于5")
default:
fmt.Println("默认输出")
}
fmt.Println("结束了")
}
break 停止
时间类型
package main
import (
"fmt"
"time"
)
func main() {
//获取当前时间
t := time.Now()
fmt.Println(t)
//自己指定时间 年月日时分秒 纳秒
y := time.Date(2024, 2, 17, 12, 32, 55, 1, time.Local)
fmt.Println(y)
//年
fmt.Println(y.Year())
//月 需要进行int转换
fmt.Println(int(y.Month()))
//日
fmt.Println(y.Day())
//时
fmt.Println(y.Hour())
//分
fmt.Println(y.Minute())
//秒
fmt.Println(y.Second())
//纳秒
fmt.Println(y.Nanosecond())
//获取时分秒
fmt.Println(y.Clock())
//秒差 距离1970年1月1日秒差
fmt.Println(t.Unix())
//纳秒差
fmt.Println(t.UnixNano())
//时间转字符串 2006-01-02 15:04:05 是时间转字符串的固定模版 不能改动
z := t.Format("2006-01-02 15:04:05")
fmt.Println(z)
//字符串转时间
s := "2022-11-22 13:44:55"
//2006-01-02 15:04:05 是字符串转换时间 时间转换字符串的 固定模版 不能更改
x, _ := time.Parse("2006-01-02 15:04:05", s)
fmt.Println(x)
}
数学常数和随机数
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
func main() {
//
var a float64 = 10.2
//向下取整数 10
fmt.Println(math.Floor(a))
//向上取整数 11
fmt.Println(math.Ceil(a))
//取绝对值
fmt.Println(math.Abs(a))
//返回整数位 和小数位
fmt.Println(math.Modf(a))
//取2个数的最大值
fmt.Println(math.Max(1, 2))
//取2个数的最小值
fmt.Println(math.Min(1, 2))
//取2的3次方
fmt.Println(math.Pow(2, 3))
//四舍五入
fmt.Println(math.Round(a))
//随机数种子
rand.Seed(time.Now().UnixNano())
//10以内的随机数
fmt.Println(rand.Intn(10))
}
数组
package main
import "fmt"
func main() {
//定义数组 3是数组的容量
var a [3]int = [3]int{1, 2, 3}
//简写数组
b := [3]int{4, 5, 6}
//简写数组
c := [...]int{7, 8, 9, 10}
fmt.Println(a, b, c)
//数组的长度 3 3 4
fmt.Println(len(a), len(b), len(c))
//对索引位置修改数据
a[1] = 66
fmt.Println(a)
//单独获取数组索引位置的数据
fmt.Println(a[2])
}
二维数组
package main
import "fmt"
func main() {
//二维数组的语法 var arr [n][m]
var a [3][3]int = [3][3]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
fmt.Println(a)
//简写二维数组 在不写var的时候 b后面必须加: 才能赋值
b := [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
fmt.Println(b)
//取出二维数组中 第一个数组的元素
a0 := a[0]
fmt.Println(a0)
fmt.Println(a0[0], a0[1])
}