Golang笔记1-变量与类型
Go 变量与类型1. 怎么声明变量// var 写法可以在函数外用全局varnamestring张三varageint25varisAdminbool// 不赋值就是零值// : 短声明只能在函数内用日常首选name:张三age:25// 一次声明多个vara,b,cintx,y:10,20// 批量声明配置/常量场景常见var(hoststringlocalhostportint8080debugbooltrue)一句话记住函数内用:函数外用var。拿不准就用var不会错。2. 基本类型// 整数varidint// 平台相关64位系统就是 int64varcountint64// 数据库 ID、大数字用这个varsmallint32// 少见除非有特殊需求// 浮点varpricefloat64// 后端基本只用 float64精度够varratiofloat32// 少用// 字符串varnamestring张三// 布尔varisActivebooltrue// 字节 / 字符varbbyteA// uint8 的别名处理 ASCIIvarrrune中// int32 的别名处理 Unicode中文后端开发真正高频的int、int64、float64、string、bool。其他了解即可。3. 零值机制Go 的变量声明后一定有初始值variint// 0varffloat64// 0.0varsstring// 空字符串不是 nilvarbbool// falsevarp*int// nilvarsl[]int// nilvarmmap[string]int// nil这是 Go 的核心设计不存在未定义只有零值。所以不用担心读到垃圾值。实际用途// 利用零值不用显式初始化varcountintcount// 直接用count 从 0 开始不报错// 字符串零值判空ifname{returnerrors.New(name 不能为空)}// 指针零值判空ifusernil{returnerrors.New(用户不存在)}4. 类型转换Go 没有隐式转换必须手动写// 数字之间互转variint42varffloat64float64(i)// int → float64varuuintuint(f)// float64 → uint// string ↔ int用 strconv不是强转importstrconv// int → strings:strconv.Itoa(42)// 42s:fmt.Sprintf(%d,42)// 也行但 Itoa 更快// string → intn,err:strconv.Atoi(42)// 42, niln,err:strconv.ParseInt(42,10,64)// 指定进制和位数// string → floatf,err:strconv.ParseFloat(3.14,64)// float → strings:strconv.FormatFloat(3.14,f,2,64)// 3.14// string ↔ []byteJSON/HTTP 场景天天用b:[]byte(hello)// string → []bytes:string(b)// []byte → string新手坑string(42)不是42是 Unicode 码点 42 对应的字符\*。一定用strconv.Itoa。5. 常量与 iota定义枚举、状态码必用// 普通常量constMaxRetry3constAPIVersionv1// 批量定义const(StatusOK200StatusError500)// iota自动递增从 0 开始typeUserStatusintconst(UserStatusNormal UserStatusiota// 0UserStatusDisabled// 1UserStatusDeleted// 2)// iota 运算定义权限位、文件大小常见const(_iota// 跳过 0KB1(10*iota)// 1024MB// 1048576GB// 1073741824)用 iota 定义订单状态后端最常见场景typeOrderStatusintconst(OrderPending OrderStatusiota1// 1 待支付OrderPaid// 2 已支付OrderShipped// 3 已发货OrderCompleted// 4 已完成OrderCancelled// 5 已取消)// 配合 Stringer 方法打日志更清晰func(s OrderStatus)String()string{switchs{caseOrderPending:return待支付caseOrderPaid:return已支付default:return未知状态}}最容易卡壳的 4 个场景① 类型别名 vs 类型定义差一个等号差很多// 类型定义MyInt 是全新类型和 int 不能直接混用typeMyIntintvara MyInt10varbint20// a b ← 编译报错必须转换aMyInt(b)// ✅// 类型别名就是 int完全一样可以混用typeMyIntintvara MyInt10varbint20ab// ✅ 没问题什么时候用类型定义定义领域类型防止乱传参。typeUserIDint64typeOrderIDint64funcGetOrder(userID UserID,orderID OrderID){}// 这样就不会把 userID 和 orderID 传反编译器帮你检查② 变量作用域后端写 if 判断时的坑// if 里声明的变量出了 if 就不存在iferr:doSomething();err!nil{log.Println(err)// ✅ err 在这里有效}// log.Println(err) ← 这里编译报错err 不存在// 需要在外面用时提前声明varresultstringifxxx{resultaaa}else{resultbbb}fmt.Println(result)// ✅// for 循环里的变量同理fori:0;i10;i{// i 只在循环内有效}③ 多返回值赋值Go 后端的 err 处理// 标准写法result,err:db.Query(SELECT ...)iferr!nil{returnerr}// 只想要其中一个用 _ 丢掉_,err:fmt.Println(hello)// 已经声明过的变量: 只要有一个新变量就能用name,err:getName()// name 和 err 都是新的age,err:getAge()// age 是新的err 是复用的 ✅④ 字符串处理后端高频操作import(stringsstrconvfmt)s: Hello, 张三 // 清空前后空格处理用户输入必用sstrings.TrimSpace(s)// Hello, 张三// 判断包含strings.Contains(s,张三)// truestrings.HasPrefix(s,Hello)// true// 分割与拼接parts:strings.Split(a,b,c,,)// [a, b, c]joined:strings.Join(parts,-)// a-b-c// 替换sstrings.ReplaceAll(s,张三,李四)// Hello, 李四// 大小写strings.ToLower(Hello)// hellostrings.ToUpper(Hello)// HELLO// 高效拼接循环里别用 用 Buildervarsb strings.Builderfori:0;i5;i{sb.WriteString(strconv.Itoa(i))}result:sb.String()// 012343 个新手常踩的坑坑 1声明了不用编译报错funcmain(){x:10// ❌ x declared and not used → 编译失败}// 暂时不想用用 _ 或者直接删掉_x// ✅ 临时用法正式代码别这么写这是 Go 故意的设计逼你写干净的代码。坑 2浮点数不要用来存钱// ❌ 浮点数有精度误差varpricefloat640.10.2fmt.Println(price)// 0.30000000000000004// ✅ 存钱用分作为单位用 int64varpriceint64100// 代表 1.00 元展示时再除以 100// ✅ 或者用第三方库importgithub.com/shopspring/decimalprice:decimal.NewFromFloat(0.1).Add(decimal.NewFromFloat(0.2))坑 3:以为是修改其实是创建了新变量作用域遮蔽err:errors.New(第一个错误)iftrue{err:errors.New(新错误)// ❌ 这是新的 err外面那个没变_err}fmt.Println(err)// 还是第一个错误不是你以为的新错误// ✅ 正确做法不用 :用 iftrue{errerrors.New(新错误)// 修改外层的 err}后端开发变量声明的固定套路// 1. 配置类var 批量声明var(dbHostos.Getenv(DB_HOST)dbPortos.Getenv(DB_PORT))// 2. 函数内中间变量: 短声明userID,err:strconv.ParseInt(c.Param(id),10,64)iferr!nil{c.JSON(400,gin.H{error:id 格式错误})return}// 3. 状态/枚举type const iotatypeStatusintconst(StatusActive Statusiota1StatusInactive)// 4. 领域类型type 定义防止传参出错typeUserIDint64typeRoleIDint64一句话总结函数内用 :函数外用 var 零值是保底不会有垃圾值 类型转换必须显式strconv 处理字符串 iota 定枚举类型定义防传参出错 浮点数不存钱字符串拼接用 Builder
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2490393.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!