Go+Python双语言混合开发课程 第02部分 go语言基础

1,692 阅读9分钟

第二部分 go语言基础

2.1 go语言介绍

www.cnblogs.com/qfru/p/1060…

2.1.1 go语言介绍

google开源

太多互联网技术都是google开源出来的

go核心团队

cloud.tencent.com/developer/a…

go创作背景

google内部很多系统都是c++完成的, 但是编译过程太慢了,加上语言本身复杂, 很多语言发展的过程都是不断的加功能,

导致语言越来越臃肿, 加上互联网的发展,不如单独开发一门语言, 这种语言的代表是js,补丁语言,一开始是7天搞出来的

go语言初期目的是替代c++, 后面会看到go提倡简单、高效: 继承但是摒弃了很多c++用的不多的特性, 不是功能越多越好, c和c++就是一个例子

目前主流的编程语言基本上都是2000年以前的:

 c 1972
 c++ 1983
 python 1991
 java 1995
 php 1995
 javascript 1995

中间在2005年amd发布了双核处理器,多核开始流行,但是目前主流编程语言已经发布 go语言的发展节点

2.1.2 go语言核心特征

静态语言(编译型语言)

2.1.3 go语言的优势

语法简单 - 参考了多门语言, 可以大量看到 c、和python的影子
开发效率高
执行性能好 - 赶上并超过了java了
并发编程
编译速度
部署方便

2.1.4 go语言能做什么

服务端开发gin beego

容器虚拟化dockerk8s
存储etcd
tidb
influxdb
groupcache
区块链
以太坊
fabric
微服务
生态越来越完善

2.1.5 go目前的发展趋势

  1. 国内的go发展比国外快

  2. 国内的招聘需求增长很迅速

阿里巴巴
腾讯
百度
字节跳动
B站
小米
滴滴
京东
360
七牛云
知乎
美团

dubbo-go 很多国内厂商开始支持go,go已经成为首批支持的语言

2.2 变量与常量

2.2.1 如何定义变量

1单声明变量

var名称类型是声明单个变量的语法。

  1. 第一种,指定变量类型,声明后若不赋值,使用默认值
var name string
name ="bobby"
  1. 第二种,根据值自行判定变量类型(类型推断Type inference)

如果一个变量有一个初始值,Go将自动能够使用初始值来推断该变量的类型。因此,如果变量具有初始值,则可以省略变量声明中的类型。

var name ="bobby"
  1. 第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的(多个变量同时声明时,至少保证一个是新变量),否则会导致编译错误(简短声明)
var a int = 10
var b = 10
c : = 10

这种方式它只能被用在函数体内,而不可以用于全局变量的声明与赋值

package main
var a = "bobby"
var b string = "imooc"
var c bool

func main(){
    println(a, b, c)
}

2 多变量声明

** **

  1. 第一种,以逗号分隔,声明与赋值分开,若不赋值,存在默认值
var name1, name2, name3 type
name1, name2, name3 = v1, v2, v3
  1. 第二种,直接赋值,下面的变量类型可以是不同的类型
var name1, name2, name3 = v1, v2, v3
  1. 第三种,集合类型
var (
    name string
    age int
)

注意:

  • 变量必须先定义才能使用
  • go语言是静态语言,要求变量的类型和赋值的类型必须一致。
  • 变量名不能冲突。(同一个作用于域内不能冲突)
  • 简短定义方式,左边的变量名至少有一个是新的
  • 简短定义方式,不能定义全局变量。
  • 变量的零值。也叫默认值。
  • 变量定义了就要使用,否则无法通过编译。

如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=,但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值。

如果你在定义变量 a 之前使用它,则会得到编译错误 undefined: a。如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误,例如下面这个例子当中的变量 a:

func main() {
   var name string = "bobby"
   fmt.Println("bobby, imooc")
}

尝试编译这段代码将得到错误 a declared and not used

单纯地给 a 赋值也是不够的,这个值必须被使用,所以使用在同一个作用域中,已存在同名的变量,则之后的声明初始化,则退化为赋值操作。但这个前提是,最少要有一个新的变量被定义,且在同一作用域,例如,下面的y就是新定义的变量

package main

import (
    "fmt"
)

func main() {
    x := 140
    fmt.Println(&x)
    x, y := 200, "abc"
    fmt.Println(&x, x)
    fmt.Print(y)
}

3 匿名变量

在使用多重赋值时候,如果不需要在左值中接收变量,可以使用匿名变量 _, python中也经常有这种用法

for data, _ in range list {
}

//python 中
data = [2,4,1,6]
for _, item in enumerate(data):
    print(item)

2.2.2 常量的定义

1 常量

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

显式类型定义: const b string = "abc"
隐式类型定义: const b = "abc"
package main

import "fmt"

func main() {
   const LENGTH int = 10
   const WIDTH int = 5   
   var area int
   const a, b, c = 1, false, "str" //多重赋值

   area = LENGTH * WIDTH
   fmt.Printf("面积为 : %d", area)
   fmt.Println(a, b, c)   
}

常量可以作为枚举,常量组

const (
    Unknown = 0
    Female = 1
    Male = 2
)

常量组中如不指定类型和初始化值,则与上一行非空常量右值相同

package main

import (
    "fmt"
)

func main() {
    const (
        x uint16 = 16
        y
        s = "abc"
        z
    )
    fmt.Printf("%T,%v\n", y, y)
    fmt.Printf("%T,%v\n", z, z)
}

常量的注意事项:

  • 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型
  • 不曾使用的常量,在编译的时候,是不会报错的
  • 显示指定类型的时候,必须确保常量左右值类型一致,需要时可做显示类型转换。这与变量就不一样了,变量是可以是不同的类型值

2 iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量

iota 可以被用作枚举值:

const (
    a = iota
    b = iota
    c = iota
)

第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:

const (
    a = iota
    b
    c
)
package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //独立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢复计数
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}

如果中断iota自增,则必须显式恢复。且后续自增值按行序递增

自增默认是int类型,可以自行进行显示指定类型

数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址

使用iota能简化定义,在定义枚举时很有用。

每次 const 出现时,都会让 iota 初始化为0.

const a = iota // a=0
const (
  b = iota     //b=0
  c            //c=1   相当于c=iota
)

2.2.3 匿名变量是什么

1. python中如何定义匿名变量?

1. python中如何定义匿名变量?

my_list = ["bobby", "imooc", "test"]
#不打印 index
for index, item in enumerate(my_list):
    print(item)

上面的第5行并没有打印index,实际上有些情况下,我们并不会使用index这个变量。但是这个时候index的变量不使用但是index这个名称却被占用了,所以这个时候我们就可以使用匿名变量。将上面的代码改成:

#定义匿名变量
my_list = ["bobby", "imooc", "test"]
#不打印 index
for _, item in enumerate(my_list):
    print(item)

将上面的index改为下划线 "_",表示这个地方的变量是一个匿名变量。这样既不用占用变量名又可以多一个占位符。

注意:python中申明了变量名后续代码中不使用并没有问题,但是go语言中声明了变量不使用就会报错,所以匿名变量在go语言中会更加的常用。

2. go语言中定义匿名变量

func test() (int, error)  {
    return 0, nil
}

func main() {
    _, err := test()
    if err != nil {
        fmt.Println("函数调用成功")
    }
}

说明: 第6行代码中接收函数返回值的时候使用到了匿名变量。因为此处我们并不打印返回的值而只是关心函数调用是否成功

2.2.4 本章小结

此处为语雀文档,点击链接查看:www.yuque.com/bobby-zpcyu…

2.3 计算机组成原理快速扫盲

2.3.1 为什么我们要学习计算机组成原理

  • 为什么计算机组成原理重要 a. 考研必考 - 重要性不言而喻 b. 没有计算机组成原理,操作系统原理学起来就费劲 c. 操作系统原理有多重要? ⅰ. 什么是虚拟内存 ⅱ. 多进程和多线程如何调度 ⅲ. 什么是锁和死锁 ⅳ. 不懂操作系统原理-就别想深入理解各种组件-redis,es,rabbitmq等 d. 什么是中断,以及为什么io操作的时候实际上不耗费cpu? e. 很多组件和框架都会变,但是计算机组成原理和操作系统原理不会变
  • 计算机组成原理有哪些知识 book.douban.com/subject/123…
  • 我们会讲解到的计算机组成原理基础 a. 课程中会学习到的计算机组成原理最基本的知识点 b. 进制以及进制转换 c. ascii码表和内存的一些基础知识
  • 为什么我们会安排这些 a. python为我们屏蔽了不少的底层细节 b. 这些细节在静态语言中我们需要知道的更多 c. 如果实现不知道,对于静态语言的学习会造成一些困扰
  • 如何学习计算机组成原理 这些知识对于我们来说必须要记住,但是你得知道大概,别到时候别人给你提起或者网上看到资料省略了这些基础你不知道 这么多知识点记住不现实,当你看到很多深入讲解原理的文章的时候会或多或少的涉及到操作系统原理和计算机组成原理