Golang 知识点总结

Golang 知识点总结

目录 [?]

  1. 各种类型复制的时候的花费
  2. 可使用内建函数的类型 (len、cap、close、delete、make)
  3. 内建容器类型的值比较
  4. 组合类型T{...}的值比较
  5. 零值是nil的类型
  6. 编译时被执行的函数
  7. 不能被寻址的值
  8. 不支持比较的类型
  9. 可命名的源代码元素
  10. 命名的源代码元素可以使用 ()分组声明
  11. 可以在函数内外声明的源代码元素
  12. 可以返回一个可选bool返回值的表达式
  13. 使用channel机制永远阻塞当前goroutine的方法
  14. 连接字符串的几种方法

原文: Golang Summaries by TapirLiu

本文是由TapirLiu总结的Golang中的一些知识点,对于深入学习Golang很有帮助,所以我特意翻译了一下。

各种类型复制的时候的花费

本节标题也可以叫做“各种类型的值的大小” (the sizes of values of all kinds of types),底层可被不同的值共享的数据的大小未被计算。

下面的表格中一个 word在32bit操作系统中代表4个字节,在64bit操作系统中代表8个字节,内容基于官方的Go 1.7的编译器。

Type Cost Of Value Copying (Value Size)
bool 1 byte
int8, uint8, byte 1 byte
int16, uint16 2 bytes
int32, uint32, rune 4 bytes
int64, uint64 8 bytes
int, uint, uintptr 1 word
string 2 words
pointer 1 word
slice 3 words
map 1 word
channel 1 word
function 1 word
interface 2 words
struct the sum of sizes of all fields
array (element value size) * (array length)

可使用内建函数的类型 (lencapclosedeletemake)

len cap close delete make
string Yes
array (and array pointer) Yes Yes
slice Yes Yes Yes
map Yes Yes Yes
channel Yes Yes Yes Yes

上面的所有类型都可以使用 range遍历。

可以用作len函数参数的类型也叫做容器类型。

内建容器类型的值比较

假定容器的值可寻址(addressable)。

Type 长度可变 元素可更新 元素可寻址 查找会更改容器的长度 底层元素可以共享
string No No No No Yes
array No Yes Yes No No
slice No Yes Yes No Yes
map Yes Yes No No Yes
channel Yes No No Yes Yes

组合类型T{...}的值比较

Type (T) T{}是类型T的零值?
struct Yes
array Yes
slice No (零值是 nil)
map No (零值是 nil)

零值是nil的类型

Type (T) Size Of T(nil)
pointer 1 word
slice 3 words
map 1 word
channel 1 word
function 1 word
interface 2 words

这些类型的零值的大小和上面类型的大小保持一致。

编译时被执行的函数

如果函数在编译时被执行,那么它的返回值是常量。

Function 返回值 编译时便计算?
unsafe.Sizeof uintptr Yes, 总是
unsafe.Alignof
unsafe.Offsetof
len int 有时候是

Go 规范中讲到:

  • 如果s是字符串常量,则len(s)是常量.
  • 如果s是数组或者是数组指针,则len(s)是常量.

cap
real float64
(默认类型)
有时候是

Go 规范中讲到: 如果s是复数常量,则real(s) 和imag(s) 是常量.

imag
complex complex128
(默认类型)
有时候是

Go 规范中讲到: 如果sr 和si都是常量,则complex(sr, si)是常量.

不能被寻址的值

下面的值不能被寻址(addresses):

  • bytes in strings:字符串中的字节
  • map elements:map中的元素
  • dynamic values of interface values (exposed by type assertions):接口的动态值
  • constant values:常量
  • literal values:字面值
  • package level functions:包级别的函数
  • methods (used as function values):方法
  • intermediate values:中间值
    • function callings
    • explicit value conversions
    • all sorts of operations, except pointer dereference operations, but including:
      • channel receive operations
      • sub-string operations
      • sub-slice operations
      • addition, subtraction, multiplication, and division, etc.

注意, &T{}相当于tmp := T{}; (&tmp)的语法糖,所以&T{}可合法不意味着T{}可寻址。

下面的值可以寻址:

  • variables
  • fields of addressable structs
  • elements of addressable arrays
  • elements of any slices (whether the slices are addressable or not)
  • pointer dereference operations

不支持比较的类型

下面的类型不支持直接比较:

  • map
  • slice
  • function
  • struct types containing incomparable fields
  • array types with incomparable elements

这些不能直接比较的类型不能用做map的key值。

注意:尽管map、slice、function类型不支持直接比较,但是它们的值却可以和nil直接比较。如果两个接口的动态类型不能比较,运行时比较这两个接口会panic,除非其中一个的动态值是untyped nil。

可命名的源代码元素

下面的源代码元素可以命名,名称必须是 Identifier

可以使用 _ 做名称?
package No
import Yes
type Yes
variable Yes
constant Yes
function Yes
label Yes

命名的源代码元素可以使用 ()分组声明

下面的类型可以使用()分组生命

  • import
  • type
  • variable
  • constant

函数和标签(label)不能使用()分组声明。

可以在函数内外声明的源代码元素

下面的类型可以声明在函数内,也可以声明在函数外:

  • type
  • variable
  • constant

import必须在其它元素的声明的前面(package语句的后面)。

函数在其它函数的外面声明。(译者注:函数变量/匿名函数可以在函数内声明)

标签(label)必须声明在函数内。

可以返回一个可选bool返回值的表达式

下面的表达式可以返回一个可选的bool值:

可选的bool返回值的意义 忽略可选值会影响程序的行为?
map element access map中是否包含要 No
channel value receive 在channel关闭前收到的值是否已发出 No
type assertion 接口的动态类型是否符合asserted type Yes

(当可选值被忽略时,如果类型不match则会抛出panic)|

使用channel机制永远阻塞当前goroutine的方法

下面的方法都可以永远阻塞当前的goroutine:

1、receive from a channel which no values will be sent to

1

2

3
<-make(chan struct{}) 

// or

<-make(<-chan struct{})

2、send value to a channel which no ones will receive values from

1

2

3
make(chan struct{}) <- struct{}{}

// or

make(chan<- struct{}) <- struct{}{}

3、receive value from a nil channel

1
<-chan struct{}(nil)

4、send value to a nil channel

1
chan struct{}(nil) <- struct{}{}

5、use a bare select block

1
select{}

连接字符串的几种方法

下面几种方法都可以连接字符串(译者注:不考虑性能):

1、使用+连接字符串。如果连接的字符串少于6个,官方的编译器会对此优化,所以通常使用+简便而有效。
2、使用strings包中的strings.Join连接字符串。
3、使用fmt包中的fmt.Sprintffmt.Sprint 和 fmt.Sprintln连接字符串。这三个方法可以将任意的类型连接成字符串。fmt.Sprintln会在字符串之间加空格,在字符串尾部加新的换行符。如果两个值中的至少一个不是字符串,fmt.Sprint会在它们之间加空格。
4、包bytesBuffer类型(或者内建函数copy)可以用来构建 byte slice, byte slice可以方便地转换成字符串。

时间: 2024-10-12 19:49:56

Golang 知识点总结的相关文章

[Journey with golang] 0. Planning for the New year and new journey

最近由于一些事务,开始写golang.由于golang本身的简洁性和易用性(当然,它还是一门强类型语言),让我感觉这门语言不仅有趣,而且具有很高的实用性. 为了进一步系统学习这门语言,元旦期间我将每天更新博客,权当golang知识点复习(反正在家也是无聊). 关于golang的书籍,个人推荐李文塔的<Go语言核心编程>和最权威的<The Go Programming Language>. 时间仓促,水平所限,难免有错.欢迎大家批评指正. 原文地址:https://www.cnblo

golang 特殊知识点

golang 代码不需要分号; 但是又会自己在底层增加;号 golang的{左花括号必须在代码的最后一行,而不能在新的一行 golang的函数返回值,如果有多个返回值参数,还必须用 类似(int,error)这样的括号扩住,有点恶心; golang 代码组织里需要注意 vendor 和 internal 的特殊用法 参考链接: Golang Vendor 原文地址:https://www.cnblogs.com/ayanmw/p/8734500.html

Golang 数组 切片 字典 基本知识点

数组 数组的声明 var arrayName [arraySize]dataType eg: var array1 [5]int 在声明数组时,必须指定数组名,数组长度和数组元素的类型. 数组的初始化 当数组定义好以后,如果没有给数组元素指定值,则所有元素被自动初始化为类型所对应的零值 var array1 [5]int // [0 0 0 0 0] 变量的类型零值 在Go语言中,当一个变量被定义为某一种类型后,Go语言会自动初始化其值为零(Zero Value) 零值并不等于空值,而是当变量被

Golang学习笔记

仅以记录学习过程中各种知识点 对象声明:var obj1 map[string]string json序列化:ret,err := json.Marshal(obj1) ,ret为序列化的结果([]byte),可使用string(ret)转换为字符串 json反序列化:var obj1 map[string]interface{}                          err=json.Unmarshal([]byte(str1), &obj1) 发起http请求:func  (th

公开课|一个小运维的《Golang 入门心路历程》

成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成. 视频版 公开课主要内容: 缘起 初识 熟悉 实践 爱上 缘起 本人之前是 hadoop hbase 运维,为了节约成本 hadoop client 都是多用户的,也就是不同的业务线在同一台机器上.导致一个问题就是一个业务资源占用高,跑死其他业务线.在这种情况下我就想如何解决这个问题呢?这时候我接触到了 Docker--实现资源隔离.随着对Docker的深入了解以及身边人经常谈论 Go 语言,我感觉 Go 语言很牛,平时开始慢慢关注 G

golang - gob与rpc

今天和大家聊聊golang中怎么使用rpc,rpc数据传输会涉及到gob编码,所以先讲讲gob,别担心,就算你完全没有接触过gob与rpc,只要知道rpc的中文是远程过程调用,剩下的我都能给你讲明白(带你入门不包你精通)! 一.数据结构编码之gob gob全称为:Go binary Golang自带的一个数据结构序列化编码/解码工具,也就是说gob可以讲go中的一个数据结构序列化成某种东西,还能反序列化!序列化成啥我们后面来看,不管是变成一个字符串,变成二进制流,变成啥先不管,反正作用就是序列化

golang 接口开发入门01- 从0开始构建项目

之前写了两篇golang开发入门文章,太过潦草,赶着10.1 放假的前夕,想着还是要认真对待自己写的东西,记录学习的点滴,以后也许会忘了现在学习的东西,但是好歹留下一些文字,同时也希望能给花时间读我博客的人真正有些帮助. 前期准备 因为golang 之前断断续续学过一点,所以现在就以开发一个用户管理这样简单的功能入手.如果你现在在看我的这篇文章,你需要要具备以下知识点 1.golang 开发环境搭建 2.golang 的基本语法 3.面向对象和mvc开发思想 搭建项目 我使用eclipse作为开

中级前端知识点提要

中级前端知识点提要 标签(空格分隔): JavaScript HTML 基础 1 Restful API Representational State Transfer(表现层状态转移). URL定位资源,用HTTP动词(GET POST PUT DELETE)描述操作. 资源.统一接口.URI.无状态. 应该将API的版本号放入URL:URL中只能有名词而不能有动词:API应该提供参数. 2 CommonJS/AMD/CMD/ES6 Module 2.1 CommonJS 是Node.js模块

使用Golang开发一个本地代理

引言 最近需要对接一个接口,人家提供了两种调用方式,第一种是基于IE浏览器的Active,第二种是动态链接库dll.我们公司的产品不支持IE,所以只能通过调用dll来完成了. 之前我已经用Java实现了这个代理,但是感觉很笨重,依赖于容器还有JVM一大堆,这个代理要安装在客户端电脑上,基于Http协议来调用,然后透传参数调用dll,将返回的结果转换为Json. 如今我想用Golang来实现这个功能,它不依赖特定的运行环境,而且天然高并发,适合做网络通信相关,结合了Java的高效和C的高性能. 一