Go语言高级编程

https://chai2010.cn/advanced-go-programming-book/

为什么学习golang

golang的创始人: Rob Pike(罗伯.派克),Ken Thompson(肯.汤普森)和Robert Griesemer(罗伯特.格利茨默) 。

  • Rob Pike:曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8 字元编码。
  • Ken Thompson:主要是B语言、C语言的作者、Unix之父。1983年图灵奖(Turing Award)和1998年美国国家技术奖(National Medal of Technology)得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出C语言的B程序语言。
  • Robert Griesemer:在开发Go之前是Google V8、Chubby和HotSpot JVM的主要贡献者。
  • 此外还有Plan 9开发者Russ Cox、和曾改善目前广泛使用之开原码编译器GCC的Ian Taylor。

可以将golang看作进化版的c语言

python是开发效率和表现力很强的语言, 唯一的缺点在于脚本语言与生俱来的效率.

可以用C扩展提速python,但是开发效率低.golang刚刚好.

谨慎开始学习一门新语言, 在python自身优化(包括使用必要的库)足够的情况下,没必要学习golang.

第1章 语言基础

我不知道,你过去10年为什么不快乐。但相信我,抛掉过去的沉重,使用Go语言,体会最初的快乐!——469856321

Go语言终于完成了从单机单核时代的C语言到21世纪互联网时代多核环境的通用编程语言的蜕变。

Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视,最终的目标是设计网络和多核时代的C语言。

源文件采用UTF8编码是Go语言规范所要求的

简单是重要的原则,于技术,于生活都是.

  • 所有的Go程序,都是由最基本的函数和变量构成
    • 函数和变量被组织到一个个单独的Go源文件中
      • 这些源文件再按照作者的意图组织成合适的package
        • 最终这些package再有机地组成一个完整的Go语言程序。 - main包中的main函数默认是每一个可执行程序的入口

fmt是format单词的缩写,表示格式化相关的包

Go语言中的字符串内容是不可变更的.这和Python是相同的.

在Go语言中,函数参数都是以复制的方式(不支持以引用的方式)传递, 这和 Python是不同的.

Go语言采用是否大小写首字母来区分符号是否可以被导出:大写字母开头表示导出的公共符号,小写字母开头表示包内部的私有符号。

你好, 世界!

helloworld.og

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func main() {
// net/http包构造了一个独立运行的http服务
// http.HandleFunc("/", ...)针对/根路径请求注册了响应处理函数
// 在响应处理函数中,使用fmt.Fprintf格式化输出函数实现了通过http协议向请求的客户端打印格式化的字符串
//     同时通过标准库的日志包在服务器端也打印相关字符串。
// 最后通过http.ListenAndServe函数调用来启动http服务。
    fmt.Println("Please visit http://127.0.0.1:12345/")
    http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        s := fmt.Sprintf("你好, 世界! -- Time: %s", time.Now().String())
        fmt.Fprintf(w, "%v\n", s)
        log.Printf("%v\n", s)
    })

    if err := http.ListenAndServe(":12345", nil); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

以脚本方式运行:

go run helloworld.go

编译并以exe方式运行:

go build helloworld.go
helloworld.exe

数组、字符串和切片

在主流的编程语言中数组及其相关的数据结构是使用得最为频繁的,只有在它(们)不能满足时才会考虑链表、hash表(hash表可以看作是数组和链表的混合体)和更复杂的自定义数据结构。

Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现。

  • 首先,Go语言的数组是一种值类型,虽然数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的。
  • Go语言字符串底层数据也是对应的字节数组,但是字符串的只读属性禁止了在程序中对底层字节数组的元素的修改。字符串赋值只是复制了数据地址和对应的长度,而不会导致底层数据的复制。
  • 切片的行为更为灵活,切片的结构和字符串结构类似,但是解除了只读限制。切片的底层数据虽然也是对应数据类型的数组,但是每个切片还有独立的长度和容量信息,切片赋值和函数传参数时也是将切片头信息部分按传值方式处理。因为切片头含有底层数据的指针,所以它的赋值也不会导致底层数据的复制。其实Go语言的赋值和函数传参规则很简单,除了闭包函数以引用的方式对外部变量访问之外,其它赋值和函数传参数都是以传值的方式处理。

要理解数组、字符串和切片三种不同的处理方式的原因需要详细了解它们的底层数据结构。

数组

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。

数组的长度是数组类型的组成部分。

因为数组的长度是数组类型的一个部分,不同长度或不同类型的数据组成的数组都是不同的类型,因此在Go语言中很少直接使用数组(不同长度的数组因为类型不同无法直接赋值)。

和数组对应的类型是切片,切片是可以动态增长和收缩的序列,切片的功能也更加灵活,但是要理解切片的工作原理还是要先理解数组。

© Licensed under CC BY-NC-SA 4.0

别向医生和律师提供错误的消息。—— 本杰明·富兰克林

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!