Golang 基础01

复制代码
Weekday:以int为底层类型,眼熟【自定义类型 + iota】 的枚举写法

type 关键字,用于定义自定义类型或给已有类型取别名
Go 复制代码
type Weekday int

自定义类型,这里需注意:Weekday ≠ int 虽然存储的数据类型相同,但是Weekday与int之间的赋值必须显示转换。

const()可以批量定义常量

Go 复制代码
const (
    Sunday Weekday = iota
    Mondat
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

iota 是常量生成器,从0开始,每次累加。首个常量使用之后其余自动累加。同行内iota值相同

这里需要注意的是 Atoi和Itoa,他们相似但是作用不同,Atoi和Itoa是strconv里面的两个方法,用于把字符串和整形之间互相转化。Atoi:str-》int,Itoa:int-》str

Go 复制代码
func (d Weekday) String() string { // 值接收者方法: 等价于 func String(d Weekday) string
	names := [...]string{ // [...] 让编译器按元素个数推导数组长度(此处为 7)
		"周日", // 下标 0
		"周一", // 下标 1
		"周二", // 下标 2
		"周三", // 下标 3
		"周四", // 下标 4
		"周五", // 下标 5
		"周六", // 下标 6
	} // 数组字面量结束
	if d < Sunday || d > Saturday { // 边界检查, 避免下标越界导致 panic
		return fmt.Sprintf("Weekday(%d)", int(d)) // %d 需要整型实参, 所以显式转换
	} // if 结束
	return names[d] // 整数类型可直接作数组下标; 返回元素的副本
} // 方法结束

该函数属于Weekday类型的专属函数,任何Weekday类型的常量以及变量都可以调用该函数

函数的具体作用就是根据变量或常量的值来进行判断,输出日期或者其他信息

使用场景:订单状态,待支付、已支付、已发货、已完成、已取消

由于1.26版本的go依旧没有枚举,所以使用上面的自定类型+iota来进行。接下来是订单状态的完整示例

Go 复制代码
type OrderStatus int

const (
	OrderPending OrderStatus = iota
	OrderPaid
	OrderShipped
	OrderCompleted
	OrderCancelled
)

func (o OrderStatus) String() string {
	Status := [...]string{"Pending", "Paid", "Shipped", "Completed", "Cancelled"}

	if o < OrderPending || o > OrderCompleted {
		return "数据越界"
	}
	return Status[o]
}

func main() {
	order1 := OrderPending
	fmt.Println(order1.String())
}

第二个例子,权限控制的例子

Go 复制代码
type UserPermission int

const (
	CanRead UserPermission = 1 << iota
	CanWrite
	CanExecute
)

func (u UserPermission) OutputPermission() {
	permissions := [...]struct {
		permission UserPermission
		name       string
	}{
		{CanRead, "CanRead"},
		{CanWrite, "CanWrite"},
		{CanExecute, "CanExecute"},
	}

	for _, p := range permissions {
		if p.permission&u == p.permission {
			fmt.Println("Can ", p.name)
		} else {
			fmt.Println("Can not ", p.name)
		}

	}
}

func main() {
	user1 := CanRead | CanWrite
	user1.OutputPermission()
}

位运算 与或非 & | ^ 左移<< 右移>>

|------|-------------------------|-----------|----|
| | 左值 | 右值 | 结果 |
| & | 1 | 0 | 0 |
| | 0 | 1 | 0 |
| | 0 | 0 | 0 |
| | 1 | 1 | 1 |
| | | 1 | 0 | 1 |
| | 0 | 1 | 1 |
| | 0 | 0 | 0 |
| | 1 | 1 | 1 |
| ^ | | 1 | 0 |
| | | 0 | 1 |
| << | 公式:a<<n a左移n位,a*2^n | | |
| >> | 公式:a>>n a右移n位a/2^n | 右移自动去掉小数位 | |

相关推荐
进击的大海贼2 小时前
基于C#开发的久坐提醒工具
开发语言·c#
天空鸟_时光不老2 小时前
06-给AI流程加一道人工闸门
java·人工智能·spring boot·后端·spring·spring cloud·架构
平生幻2 小时前
unbuntu虚拟机确认python安装位置
开发语言·python
花间相见2 小时前
【计算基础|网络06】HTTPS(上):加密体系与 RSA 握手
后端·面试
夜之眷属2 小时前
JVM实战:服务器堆外内存去哪了(NMT实测)
java·服务器·jvm·后端·性能优化
JWASX2 小时前
Java 转 go 学习 - dubbo-go(1)
学习·golang
vipxieliang2 小时前
PHP 依赖注入容器从零实现:控制反转、手动注入与容器管理全解析
后端·php
运维行者_2 小时前
PHP性能监控怎么做?从响应时间到慢函数的6个关键指标
运维·服务器·开发语言·网络·支持向量机·php·接口隔离原则
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: Nacos 配置管理之添加配置与 dataId 命名规范
java·开发语言·spring cloud