Yin的笔记本

vuePress-theme-reco Howard Yin    2021 - 2025
Yin的笔记本 Yin的笔记本

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
author-avatar

Howard Yin

303

Article

153

Tag

Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
  • Go语言

    • Go语言的核心思想
      • 并发
    • Go语言的线程模型:CSP线程模型
      • 传统的线程模型
      • Go语言推荐的线程模型
    • Go的包
      • Go的函数
        • Go的指针
          • &Type{}和new(Type)

      Go语言

      vuePress-theme-reco Howard Yin    2021 - 2025

      Go语言


      Howard Yin 2019-10-15 02:38:00 Go设计思路编程语言

      # Go语言的核心思想

      # 并发

      Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

      对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

      # Go语言的线程模型:CSP线程模型

      # 传统的线程模型

      # Go语言推荐的线程模型

      Go条件语句select

      CSP communicating sequential processes

      # Go的包

      在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的。例如,Pizza 就是个已导出名,Pi 也同样,它导出自 math 包。

      pizza 和 pi 并未以大写字母开头,所以它们是未导出的。

      在导入一个包时,你只能引用其中已导出的名字。任何“未导出”的名字在该包外均无法访问。就算是在一个已导出的类中定义的方法,如果是以小写字母开头,也是不能导出的。

      # Go的函数

      函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用。

      # Go的指针

      go的指针用法和C语言基本相同,用&取地址、*解指针;指针和值修改的各种特性也和C语言相同。此处只介绍几个go语言独特的地方。

      # &Type{}和new(Type)

      下面这几个例子是等价的:

      a:=&Type{}
      
      1
      func f()*int{
         i:=0
         return &i
      }
      
      a:=f()
      
      1
      2
      3
      4
      5
      6
      a:=new(Type)
      
      1
      func f()*Type{
         a:=new(int)
         return a
      }
      
      a:=f()
      
      
      1
      2
      3
      4
      5
      6
      7

      看出来什么了吗?没错,在go语言里面a:=&Type{}和a:=new(Type)都是分配堆空间,每次a:=&Type{}和a:=new(Type)操作得到的都是不同的地址。比如调用上面两个f函数的任一个:

      func main() {
         p:=f()
         pp:=f()
         *p=1
         fmt.Println(*pp)
      }
      
      1
      2
      3
      4
      5
      6

      这里的输出是0。这就和C语言不一样了,因为在C语言里面,函数里的变量都分配的是栈空间,比如下面这个函数:

      int* f(){
         int i = 0;
         return &i;
      }
      
      1
      2
      3
      4

      这里会返回程序中的局部变量在函数栈中的地址,在编译时会报warning: address of local variable ‘i’ returned [-Wreturn-local-addr]。

      一般来说,go里面a:=&Type{}用的比a:=new(Type)多,因为a:=new(Type)在新建Type实例时只能初始化为0值,而a:=&Type{}可以指定初始值。

      帮助我们改善此页面!
      创建于: 2019-09-23 07:37:12

      更新于: 2019-10-15 02:38:07