『No2: Go 基础知识』

golang-second.png

Golang 基础知识

大家好,我叫谢伟,是一名程序员。

刚刚工作一年,在编程领域是一名小兵。

对于初学者,或者说自学编程的人, 我非常理解他们自学的烦恼在哪里。

因为我也是从自学一路过来的。都会经历这些过程, 坚持下去就行, 相信我, 你幷不孤独.

如果你打算走编程的道路, 第一份工作一定要你喜欢, 或者说不讨厌,同时又是在编程的路上. 坚持下去, 相信我, 你幷不孤独.

怕的是你第一份工作因为诱惑, 走了其他路, 内心又想编程, 这种纠纠结结的状态,会让你过的很不舒服, 焦虑, 难以成长.

我2016年算是正式开始编程。那时小大小闹, 不正规, 怎么好玩怎么来, 学了忘, 忘了学...

我自学编程的时候都是写一些小的示例。没资源,没途径了解在企业里,到底需要些什么样的技能。于是一遍遍熟悉编程语言的特性。相信自学的编程的人大都是这样, 稍微厉害点的,肯琢磨的, 搞几个项目, 可见的项目出来, 就越来越熟练.

我直到毕业后,前大半年都是在学习,慢慢的接触一些东西。知道企业的一般开发流程是怎样的。企业需要什么样的技能,企业需要什么的技术。

我觉得我有必要分享出来一些企业的解决方式:

  • 会用些什么
  • 开发流程是什么样的
  • 需要什么样的人
  • 怎么技术选型
    ...

当然这些受限于我自己的经验,但还是希望对大家有启发.

我的这个专栏,主要是想在自己已经使用 Golang 大半年写了几千行代码、搞过两个完整的项目之后,想更精深 Golang 这门语言的语言特性。

同时我正在看《代码大全》,有必要把一些好的编程思路注意事项分享出来。

这是我写这一系列文章的初衷。

在开始之前, 我再罗嗦两句: 1. 整体统一的代码风格非常重要 2. 刚开始就坚持一些好的编程风格

基础知识

上一节讲了 Golang 环境的搭建、项目的组织和包管理工具 govendor。

插播一个第三方下载包的工具: gopm, 这个工具解决的问题是: go get 一般是从 github 服务器, 或者 google 服务器上下载第三方库, 所以有时候网速慢,或者下载不成功.

地址: gopm

  • 下载 gopm: go get -u github.com/gpmgo/gopm

  • 再使用 gopm 下载第三方库: gopm get -g -v ****

这一节讲 Golang 的基础知识。主要包括:

  • 变量
  • 常量
  • 字符串
  • 数组
  • 切片
  • Map
  • 结构体
  • 函数
  • 方法
  • 分支
  • 循环

这些内容的熟悉就能开始写代码了。

编程和写作类似,这些基础知识就相当于写作中的文字。但为什么不同的人写的代码、文章存在很大的差异,有些人写的好,有些人写的不好。

这其实是代码的组织或者的文字的组织。

初学者往往不太注意这些:

比如:

  • 不太注意变量的命名
  • 不太注意函数的命名
  • 不太注意函数的组织方式
  • 不太注意项目的组织(即:代码文件的组织)
  • 不太注意整体的布局风格

那他们在注意什么? 注意实现, 一定程度上实现能促进初学者学习的热情. 相信我, 这些不注意,往往到最后会成为你的阻碍.

写代码,最后虽然是计算机执行,但是终归是人的产品,由人来阅读。

除非你对自己的编程水平很有信心,否则这些原则需要坚持。能不抽象就不抽象。做到“望文生义”,即看到你的代码大概就知道你想要干嘛,你的函数想要实现什么样的功能,你的项目想要实现什么样的功能。

这一点,其实之前我也不是太注意。最近不是在阅读《代码大全》嘛。

写一些代码片段可能不太能感受到这些原则能有什么样的益处。一旦你的项目越来越复杂的时候,你别头疼。

1 变量

变量的注意事项有下面几点:

  • 命名:

原则:

  1. 见文知意
  2. 规范:Golang 中采用驼峰式标准:numberOfClass
  3. 首字母大写:外部可访问;首字母小写:内部访问
  4. 长度适中
  5. 避免使用关键字
var ok bool
var value string
var number int
  • 声明及初始化

原则:

  1. 明确数据类型
  2. 少使用隐式声明
# Better
var Name string

# No Good

Name := "xieWei"

在函数内部可以使用 := 初始化,自动判断变量的类型。但是建议使用显式声明

  • 使用

原则:

  1. 变量声明,靠近使用处: 即你需要使用变量就在要使用的地方声明变量,而不是提前声明一大堆,或者远离使用变量的地方,不利于阅读
  2. 多个变量声明放一起
var (
  url string
  result []byte
  err error
  )

url = "http://www.baidu.com"
if result, err = http.Get(url); err!=nil{
  // do something
}

常用的布尔值变量名称:

  • done
  • found
  • ok
  • success
  • flag

使用对仗:

  • begin/start
  • first/last
  • locked/unlocked
  • min/max
  • next/previous
  • old/new
  • opened/closed
  • visible/invisible
  • source/target
  • source/destination
  • up/down

2 常量

常量注意这几点:

  • 关键字:const

const AppName = "App"

3 字符串

  • 短的

var Help string

Help = "Thank you for Your help."

  • 长的

var HelpMessage string  

HelpMessage = `
Hello Everone:
  Welcome to here.
  Today, we will learn how to learn golang.
`

字符串常用的操作:

库: strings

内置库的使用注意两点:

  • 函数的输入值及类型

  • 函数的输出值及类型

  • Contains: 判断是否包含字符串

func Contains(s, substr string) bool
  • Count: 输出字符串中自字符的个数
func Count(s, sep string) int
  • Index: 返回字符第一次出现的位置,不存在返回 -1
func Index(s, sep string) int
  • Join: 按给定的分隔符拼接一个字符串切片成字符串
func Join(a []string, sep string) string
  • LastIndex: 子串最后一次出现的位置
func LastIndex(s, sep string) int
  • ToLower: 將字符串全部小寫
func ToLower(s string) string
  • ToUpper: 將字符串全部大寫
func ToUpper(s string) string
  • Repeat: 重復字符串
func Repeat(s string, count int ) string
  • Replace: 替換
func Replace(s, old, new string, n int) string
  • TrimSpace: 去除字符串前後空格
func TrimSpace(s string) string
  • Split: 切割
func Split(s, sep string) []string 

4 数组

固定長度列表在Golang 里称之为数组.

長度不固定的里称之为切片.


var NumberList = [3]string

NumberList = [3]string{"Python", "Golang", "Java"}

  • 获取数组长度: len
  • 获取数组容量: cap

编程中,凡是可以使用if...else的都可以使用数组来遍历,再对遍历的值进行操作.

5. 切片

相当于不固定长的数组. 可以初始设置容量, 超过容量后,自动扩充.

  • len 获取长度
  • cap 获取容量

常用的操作:

  • slice
func main(){
    var (
        value []string
    )

    value = []string{
        "xieWei",
        "weiWei",
        "wuWei",
    }

    fmt.Print(value[1:])
}

>>> [weiWei wuWei]
  • append
func main(){
    var (
        value []string
    )

    value = []string{
        "xieWei",
        "weiWei",
        "wuWei",
    }

    value = append(value, "shenWei")
    fmt.Println(value)
}

>>> [xieWei weiWei wuWei shenWei]

  • range 操作
func main(){
    var (
        value []string
    )

    value = []string{
        "xieWei",
        "weiWei",
        "wuWei",
    }
    for index, i:= range value{
        fmt.Println(index, i)
    }
}

>>> 
0 xieWei
1 weiWei
2 wuWei

6. Map

字典: 键值型

  • 声明

func mapDeclare(key string, value string)map[string]interface{}{
    var (
        body map[string]interface{}
    )
    body = make(map[string]interface{})
    body[key] = value
    return body
}

func main(){
   fmt.Println(mapDeclare("name", "xieWei"))
}

>>> map[name:xieWei]
  • 遍历
func main(){
    var (
        body map[string]interface{}
    )
    body = make(map[string]interface{})
    body["name"] = "xiewei"
    body["age"] = 26
    body["university"] = "shanghaiUniversity"
    rangeMap(body)
}
func rangeMap(body map[string]interface{}) {
    for key, value := range body{
        fmt.Println(key, value)
    }
}

>>> 
name xiewei
age 26
university shanghaiUniversity

7. 结构体

结构体在 Golang 里面的作用非常大

  • 即是数据类型
  • 又可以有方法

作用相当于其他语言的类.

  • 声明
type MyExample struct {
    Name string
    Age int
    School string
}
func declare(){
    var (
        exampleStruct MyExample
    )
    exampleStruct.Name = "xieWei"
    exampleStruct.Age = 26
    exampleStruct.School = "shanghaiUniversity"
    fmt.Println(exampleStruct)
}

func main(){
    declare()
}

>>>
{xieWei 26 shanghaiUniversity}
  • 方法:

值传递 一般获取值: func (m MyExample) GetAttrName()string
指针传递一般改变值: func (m *MyExample) SetAttrAge(newAge int)

type MyExample struct {
    Name string
    Age int
    School string
}
func declare() MyExample {
    var (
        example MyExample
    )
    example.Name = "xieWei"
    example.Age = 26
    example.School = "shanghaiUniversity"
    fmt.Println(example)
    return example
}

func (m MyExample) GetAttrName()string{
    return m.Name
}
func (m *MyExample) SetAttrAge(newAge int){
    m.Age = newAge
}

func main(){
    test := declare()
    fmt.Println(test.GetAttrName())
    fmt.Println(test)
    test.SetAttrAge(18)
    fmt.Println(test)
}

>>> 
{xieWei 26 shanghaiUniversity}
xieWei
{xieWei 26 shanghaiUniversity}
{xieWei 18 shanghaiUniversity}

  • 匿名字段

即隐式的引入一个结构体的所有字段

type MyExample struct {
    Name string
    Age int
    School string
}
type OtherExample struct {
    MyExample
}


OtherExample 自动拥有 Name, Age, School 字段

8 函数

函数分为这麽几类:

  • 匿名函数
  • 结构体的方法
  • 普通函数

要写好函数注意下面几点:

  • 函数名称: 见文知意
  • 参数
  • 返回值
  • 匿名函数: 即没有名称的函数, 字面意思, 一般用来处理简单的函数

func main(){

    var NoNameFunc = func(name string) {fmt.Println(name)}
        NoNameFunc("xiewei")
}
  • 普通函数
func GetMaxNumber(number float64, other float64) float64 {
    return math.Max(number, other)
}

- func 关键字
- GetMaxNumber 函数名称
- number, other 参数 类型 float64
- 返回值类型 float64

9 分支/判断/循环

  • if 判断
  • if ...else / switch 分支
  • for 循环
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,148评论 1 44
  • 说到幸福,真是一个大话题,老生常谈,也永远谈不完的话题。虽然有时谈起来很空洞,很虚幻,但是对“幸福”这个概念的认知...
    大杜915阅读 171评论 0 0
  • 手持一柄百锻精钢剑,想荡尽这山河,结果还是止于此。 离了弦的箭,撒出去的热血,又怎么能回头。踏上征途的那一天我就立...
    品木成森阅读 375评论 0 2