go语言细节
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语言细节的更多相关文章
- C语言细节——献给入门者(三)
C语言细节——献给入门者(三) >>主题:关于强制类型转换 先来瞎扯下强制类型转换,c语言有很多数据类型,long,short,int,float,double,bool,char等等.当 ...
- C语言细节——献给初学者(二)
C语言细节——献给初学者(二) 主题 循环运用+选择判断 C语言循环有for和while/do...while: 选择判断有:if...else和switch...case 在循环中需要注意搭配br ...
- C语言细节——献给入门者(一)
C语言细节——献给入门者(一) 主题 输入输出需要注意的细节 首先我们要知道大致有scanf(),printf(),getchar(),putchar(),gets(),puts()这几种输入方式. ...
- C语言细节总结笔记
C语言细节总结笔记 */--> C语言细节总结笔记 Table of Contents 1. 三步异或法交换数字 2. 做差法交换数字 3. 按n位置位 4. 求余求商求积 5. 辗除法求最大公 ...
- [转载] C语言细节,写的非常棒!
这篇文章主要讨论C语言细节问题.在找一份工作的时候,语言细节占的比例非常小,之前看某个贴着讨论,估计语言细节在面试中,占了10%的比重都不到,那为什么还要研究C语言的细节呢,我觉得有三个原因促使我总结 ...
- 程序员之---C语言细节12(指针和数组细节,"//"的可移植性说明)
主要内容:指针和数组细节,"//"的可移植性说明 #include <stdio.h> int main(int argc, char **argv) { int a[ ...
- C语言细节注意
前段时间用C语言写了个小的程序,也算是复习了下好久没有用的C语言.也是有好多的坑了,哈哈. 1.C语言的结构体 结构体的命名最好能够做到规范.因为不同的 编译环境下,不是很规范的命名有时候会导致莫名其 ...
- 程序员之---C语言细节19(来找茬,由/* */ 引起的凝视错误)
主要内容:由/* */ 引起的凝视错误 有4处凝视错误 #include <stdio.h> #define N 10 //使用以下宏定义的凝视 #define BSC // #defin ...
- C语言细节笔记2
C语言常见问题笔记: 1. 指针的声明 char * p1, p2; p1 是一个指向char类型的指针,而p2是一个char类型变量 这是由于 * 并不是基本类型的一部分,而是包含 ...
- C语言细节笔记1
/******************************************************************************* ——笔记 1. 函数申明的书写. 可以 ...
随机推荐
- TortoiseSVN搭建本地版本库及简单操作使用
TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...
- UIButton图文上下对齐
- (void)centerImageAndTitle:(float)spacing { // get the size of the elements here for readability CG ...
- c++ timer基于win消息队列
能够承载10w个timer通信执行,说关闭就关闭,里面用了一个比較巧妙的线程处理,呵呵10W个timer就10多个线程,请大牛不要笑话,供新手学习之用 #pragma once #include &l ...
- /proc/sysrq-trigger
立即重启计算机 echo "b" > /proc/sysrq-trigger 立即关闭计算机 echo "o" > /proc/ ...
- 'Service' object has no attribute 'process'
在使用selenium+phantomjs时,运行总是出现错误信息: 'Service' object has no attribute 'process' 出现该错误的原因是未能找到可执行程序&qu ...
- 布局重用 include merge ViewStub
在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...
- insert当 sql语句里面有变量 为字符类型的时候 要3个单引号
set @InsertStr='INSERT INTO [dbo].[T_SchoolPercentMonth]([SchoolID],[MonthOfYear],[PercentNum]) VALU ...
- 前端自动化构建工具 Gulp 使用
一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...
- datazen 修改instanceid db_encryption_key
切换到Datazen.Enterprise.Server.3.0.3327.exe 所在的目录 运行如下命令: Datazen.Enterprise.Server.3.0.3327.exe DATAZ ...
- ArcMap - 分割.
一,分割面: 1,在屏幕上新增线分割面: 使待编辑的面处于编辑状态 -> 选择待分割的面(使其处于选中状态) -> 选择编辑工具的 (Cut Polygons Tools) ->画线 ...