分享
  1. 首页
  2. 文章

Go学习笔记(五)

_sign · · 1088 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

  • I/O小练习
package main
import (
 "fmt"
 "os"
 "reflect"
)
// 定义一个Data结构体
type Data struct {
}
// 声明Data结构体的成员函数String()
func (self Data) String() string {
 return "data"
}
func main() {
 fmt.Println("Hello World!")
 // 格式化浮点数(转换成字符串)
 str := fmt.Sprintf("%f", 3.14159)
 fmt.Println(reflect.TypeOf(str))
 fmt.Println(str)
 // 向屏幕输出"A\n"
 fmt.Fprint(os.Stdout, "A\n")
 // %v智能识别输出数据的类型
 fmt.Printf("%v\n", Data{}) // 实例化结构体,将自动调用String()接口,相当于java的toString()方法
}
  • 字符串练习
package main
import (
 "fmt"
 "strconv"
 "strings"
)
func main() {
 str := "hello World"
 //包含
 fmt.Println(strings.Contains(str, "hello"), strings.Contains(str, "?"))
 // 获取某个字符的索引
 fmt.Println(strings.Index(str, "o"))
 // 判断某个字符串的前缀和后缀
 fmt.Println(strings.HasPrefix(str, "he"), strings.HasSuffix(str, "ld"))
 // 字符串切割
 ss := "1#2#3456"
 splitedStr := strings.Split(ss, "#")
 fmt.Println(splitedStr) // 返回一个字符串数组
 fmt.Println(strings.Join(splitedStr, "#")) // 用#合并字符串
 // 整型转化为字符串
 fmt.Println(strconv.Itoa(20))
 // 字符串转化成整型,返回值为(int, error)
 fmt.Println(strconv.Atoi("711"))
 // 将一个字符串解析成bool类型,返回值为(bool, error)
 fmt.Println(strconv.ParseBool("false"))
 // 将一个字符串解析成浮点数,参数列表有2个:(s string, bitSize int) 返回值为(float64, error)
 fmt.Println(strconv.ParseFloat("3.014", 64)) // 第二个参数不写--->默认转换为64位浮点数
 // 格式化判断语句,参数列表(b bool) 返回值为string
 fmt.Println(strconv.FormatBool(0 < 1))
 // 参数列表为(i int64, base int) 返回值为string
 fmt.Println(strconv.FormatInt(123, 2)) // 将10进制数转换成二进制数
 
}

XML编码处理

  • struct对象的序列化和反序列化:
package main
import (
 "encoding/xml"
 "fmt"
)
// 类名首字母大写,遵循驼峰命名法
type Person struct {
 Name string `xml:",attr"` // 属性名首字母大写,将Name转换成tag标签的一种属性
 Age int `xml:"Age"` // 自定义标签名
}
func main() {
 // 序列化结构体
 p1 := Person{Name: "Tony", Age: 18}
 // Marshal函数的返回值为([]byte, error)
 // if data, err := xml.Marshal(p1); err != nil {
 // fmt.Println(err)
 // return
 // } else {
 // fmt.Println(string(data)) // 序列化成为xml的一个流
 // }
 // 格式化输出:MarshalIndent函数参数列表为(v interface{}, prefix(前缀), indent string(缩进)) 返回值为([]byte, error)
 var data []byte
 var err error
 if data, err = xml.MarshalIndent(p1, "", " "); err != nil {
 fmt.Println(err)
 return
 }
 fmt.Println(string(data)) // 序列化成为xml的一个流
 // 将xml解析反序列化成结构体实例
 // 先new一个Person结构体类型
 p2 := new(Person)
 // Unmarshal参数列表:(data []byte, v interface{}) 返回值为error
 if err = xml.Unmarshal(data, p2); err != nil {
 fmt.Println(err)
 return
 }
 fmt.Println(p2)
}
  • 使用os.Args获取简单参数
package main
import (
 "fmt"
 "os"
)
func main() {
 // var Args []string,返回一个字符串数组
 fmt.Println(os.Args)
}
命令行参数

Go语言命名规范

命名规则:

1、 golang的变量函数命名需要使用驼峰命名法,且不能出现下划线,文件名使用下划线
2、golang中根据首字母的大小写来确定访问权限。无论是方法名常量变量名还是结构体的名称,若首字母大写,则可被其他的包访问;若首字母小写,则只能在本包中使用。通俗地讲,首字母大写是公有的,首字母小写是私有的文件的命名:全小写测试的文件:xxx_test.go中的包名文件夹名最好相同。

变量命名规则

1、变量名命名必须清晰、明了,有明确含义的单词,命名中禁止使用缩写,除非已是业界通用或标准化的缩写;
2、单字母名称仅适用于短方法中的局部变量,名称长短应与其作用域相对应。若变量或常量可能在代码中多处使用,则应赋其以便于搜索的名称且有意义的名称。
3、变量名一般遵循驼峰命名法,但遇到特有名词时,需要遵循以下规则:如果为私有变量,且特有名词为首个单词,则使用小写,如 apiClient,其它情况都应使用该名词原有的写法,如APIClient、repoID、UserID
错误示例:UrlArray,应该写成urlArray或者URLArray!

一些常见的特有名词:
// A GonicMapper that contains a list of common initialisms taken from golang/lint
var LintGonicMapper = GonicMapper{
 "API": true,
 "ASCII": true,
 "CPU": true,
 "CSS": true,
 "DNS": true,
 "EOF": true,
 "GUID": true,
 "HTML": true,
 "HTTP": true,
 "HTTPS": true,
 "ID": true,
 "IP": true,
 "JSON": true,
 "LHS": true,
 "QPS": true,
 "RAM": true,
 "RHS": true,
 "RPC": true,
 "SLA": true,
 "SMTP": true,
 "SSH": true,
 "TLS": true,
 "TTL": true,
 "UI": true,
 "UID": true,
 "UUID": true,
 "URI": true,
 "URL": true,
 "UTF8": true,
 "VM": true,
 "XML": true,
 "XSRF": true,
 "XSS": true,
}

函数命名规则

  • 驼峰式命名,名字可以长但是得把功能,必要的参数描述清楚,函数名应当是动词动词短语,如postPayment、deletePage、save。并按Javabean标准加上get、set、is前缀。例如:xxx + With + 需要的参数名 + And + 需要的参数名 + .....

结构体命名规则

1、结构体名应该是名词名词短语,如Custome、WikiPage、Account、AddressParser,WriteDbMgr,ConfMgr,避免使用Manager、Processor、Data、Info等类名,而且类名不应当是动词
2、结构体中属性名大写,如果属性名小写则在数据解析(如json解析,或将结构体作为请求或访问参数)时无法解析!

包名命名规则

  • 包名应该为小写单词,不要使用下划线或者混合大小写

接口命名规则

  • 单个函数的接口名er作为后缀,如Reader,Writer。接口的实现则去掉er
type Reader interface {
 Read(p []byte) (n int, err error)
}
  • 两个函数的接口名综合两个函数名
type WriteFlusher interface {
 Write([]byte) (int, error)
 Flush() error
}
  • 三个以上函数的接口名,抽象这个接口的功能,类似于结构体名
type Car interface {
 Start([]byte) 
 Stop() error
 Recover()
}

注释

1、在编码阶段应该同步写好变量、函数、包的注释,最后可以利用godoc导出文档。注释必须是完整的句子,句子的结尾应该用句号作为结尾(英文句号)。注释推荐用英文,可以在写代码过程中锻炼英文的阅读和书写能力,而且用英文不会出现各种编码的问题。
2、每个包都应该有一个包注释,一个位于package子句之前的块注释行注释。包中若有多个go文件,只需要出现在一个go文件中即可。

相关链接:https://blog.csdn.net/elecjun/article/details/81974777


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:_sign

查看原文:Go学习笔记(五)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1088 次点击
1 回复 | 直到 2025年05月09日 13:34:25
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏