1 数组与字符串为值类型,切片、映射、通道为值类型,赋值需注意。

 package main

 import (
"fmt"
) func main() {
//数组
a1 := []int{, , }
a2 := a1
a2[] =
fmt.Println(a1) //print: 1 2 3
fmt.Println(a2) //print: 2 2 3
// 字符串
s1 := ""
s2 := s1
s2 = ""
fmt.Println(s1) //print 123
fmt.Println(s2) //print 223
// 切片
slice1 := []int{, , }
slice2 := slice1
slice2[] =
fmt.Println(slice1) //print 2 2 3
fmt.Println(slice2) //print 2 2 3
// map
m1 := make(map[int]string)
m1[] = ""
m2 := m1
m2[] = ""
fmt.Println(m1) //print 1:2
fmt.Println(m2) //print 1:2
// chan
c1 := make(chan bool)
c2 := c1
go func() {
v := <-c2
fmt.Println(v) //print true
}()
c1 <- true
}

2 byte为uint8类型,string不是[]byte或[]rune类型。

 package main

 import (
"fmt"
) func main() {
s := "hello world"
var i interface{} = s switch i.(type) {
case []byte:
fmt.Println("string type is []byte")
case []rune:
fmt.Println("string type is []rune")
case []int8:
fmt.Println("string type is []int8")
} slice := []byte{, }
i = slice
switch i.(type) {
case []uint8:
fmt.Println("byte is uint8")//print
}
}

3 接口为类型和值的二元组,nil类型为空且值为空。

 package main

 import (
"fmt"
) func trueNil() interface{} {
return nil
} func falseNil() interface{} {
var ret *int = nil // 此nil带有类型
return ret
}
func main() {
if trueNil() == nil {
fmt.Println("trueNil") //print trueNil
} if falseNil() == nil {
fmt.Println("falseNil") //no print
}
}

4 slice,map操作多协程需要加锁。

 package main

 import (
"math/rand"
"sync"
"time"
) func main() {
Map := make(map[int]int)
wg := &sync.WaitGroup{} for i := ; i < ; i++ {
go func() {
wg.Add()
defer wg.Done()
for j := ; j < ; j++ {
Map[rand.Int()] = rand.Int()
time.Sleep(time.Millisecond)
}
}()
}
time.Sleep(time.Second * )
wg.Wait()
// 程序崩溃
}

5 defer 调用函数时,函数在当前函数结束前调用,但传给调用函数的参数在defer所在行确定,而不在调用是确定。存在多个defer时,先出现后调用。

 package main

 import (
"fmt"
) type Data struct {
data string
} func Println(data Data) {
fmt.Println(data.data)
}
func main() {
data := Data{"world "}
defer Println(data)
data.data = "hello "
defer Println(data)
// 输出: hello world 而不是: hello hello 或 world hello
}

go语言细节的更多相关文章

  1. C语言细节——献给入门者(三)

    C语言细节——献给入门者(三) >>主题:关于强制类型转换 先来瞎扯下强制类型转换,c语言有很多数据类型,long,short,int,float,double,bool,char等等.当 ...

  2. C语言细节——献给初学者(二)

    C语言细节——献给初学者(二) 主题  循环运用+选择判断 C语言循环有for和while/do...while: 选择判断有:if...else和switch...case 在循环中需要注意搭配br ...

  3. C语言细节——献给入门者(一)

    C语言细节——献给入门者(一) 主题  输入输出需要注意的细节 首先我们要知道大致有scanf(),printf(),getchar(),putchar(),gets(),puts()这几种输入方式. ...

  4. C语言细节总结笔记

    C语言细节总结笔记 */--> C语言细节总结笔记 Table of Contents 1. 三步异或法交换数字 2. 做差法交换数字 3. 按n位置位 4. 求余求商求积 5. 辗除法求最大公 ...

  5. [转载] C语言细节,写的非常棒!

    这篇文章主要讨论C语言细节问题.在找一份工作的时候,语言细节占的比例非常小,之前看某个贴着讨论,估计语言细节在面试中,占了10%的比重都不到,那为什么还要研究C语言的细节呢,我觉得有三个原因促使我总结 ...

  6. 程序员之---C语言细节12(指针和数组细节,&quot;//&quot;的可移植性说明)

    主要内容:指针和数组细节,"//"的可移植性说明 #include <stdio.h> int main(int argc, char **argv) { int a[ ...

  7. C语言细节注意

    前段时间用C语言写了个小的程序,也算是复习了下好久没有用的C语言.也是有好多的坑了,哈哈. 1.C语言的结构体 结构体的命名最好能够做到规范.因为不同的 编译环境下,不是很规范的命名有时候会导致莫名其 ...

  8. 程序员之---C语言细节19(来找茬,由/* */ 引起的凝视错误)

    主要内容:由/* */ 引起的凝视错误 有4处凝视错误 #include <stdio.h> #define N 10 //使用以下宏定义的凝视 #define BSC // #defin ...

  9. C语言细节笔记2

    C语言常见问题笔记:    1. 指针的声明     char * p1, p2;  p1 是一个指向char类型的指针,而p2是一个char类型变量  这是由于 * 并不是基本类型的一部分,而是包含 ...

  10. C语言细节笔记1

    /******************************************************************************* ——笔记 1. 函数申明的书写. 可以 ...

随机推荐

  1. TortoiseSVN搭建本地版本库及简单操作使用

    TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...

  2. UIButton图文上下对齐

    - (void)centerImageAndTitle:(float)spacing { // get the size of the elements here for readability CG ...

  3. c++ timer基于win消息队列

    能够承载10w个timer通信执行,说关闭就关闭,里面用了一个比較巧妙的线程处理,呵呵10W个timer就10多个线程,请大牛不要笑话,供新手学习之用 #pragma once #include &l ...

  4. /proc/sysrq-trigger

    立即重启计算机      echo "b" > /proc/sysrq-trigger 立即关闭计算机      echo "o" > /proc/ ...

  5. 'Service' object has no attribute 'process'

    在使用selenium+phantomjs时,运行总是出现错误信息: 'Service' object has no attribute 'process' 出现该错误的原因是未能找到可执行程序&qu ...

  6. 布局重用 include merge ViewStub

    在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...

  7. insert当 sql语句里面有变量 为字符类型的时候 要3个单引号

    set @InsertStr='INSERT INTO [dbo].[T_SchoolPercentMonth]([SchoolID],[MonthOfYear],[PercentNum]) VALU ...

  8. 前端自动化构建工具 Gulp 使用

    一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...

  9. datazen 修改instanceid db_encryption_key

    切换到Datazen.Enterprise.Server.3.0.3327.exe 所在的目录 运行如下命令: Datazen.Enterprise.Server.3.0.3327.exe DATAZ ...

  10. ArcMap - 分割.

    一,分割面: 1,在屏幕上新增线分割面: 使待编辑的面处于编辑状态 -> 选择待分割的面(使其处于选中状态) -> 选择编辑工具的 (Cut Polygons Tools) ->画线 ...