第 10 章 包 包(package) 用于组织 Go 源代码,提供了更好的可重用性与可读性。 Go 语言有超过 100 个的标准包,可以用 go list std | wc -l 命令查看标准包的具体数目,标准库为大多数的程序提供了必要的基础组件。 例如我们 Go 的第一个程序。 // hello go package main import "fmt" func main() { fmt.Println("《Go语言极简一本通》") } package main 这一行指定该文件属于 package main import ( "fmt" "book" ) func main() { bookName := "《Go语言极简一本通》" author := "欢喜" bookInfo
实例 func main() { for i := 0; i < 1000; i++ { go func(i int) { for { fmt.Printf("我打印的是:%d\n" 轻量级”线程“ 非抢占式多任务处理,由协程主动交出控制权 编译器/解释器/虚拟机层面的多任务 多个协程可能在一个或者多个线程上运行 子程序是协程的一个特例 goroutine的定义 任何函数只需加上go
2.C语言中函数的分类 1.库函数 2.自定义函数 2.1库函数 使用库函数,必须包含 #include 对应的头文件。 ); Swap(&a, &b); printf("交换后:a=%d b=%d\n", a, b); return 0; } // //int main() //{ // int a = 10 { return mid;//找到了返回下标 } } return -1;//找不到 } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10
int arr[10]; int arr[10+5]; 在C99标准之前,数组的大小必须是常量或者常量表达式 在C99之后,数组的大小可以是变量,为了支持变长数组 1.2数组的初始化 数组的初始化是指 C 语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以写代码时,要做好越界的检查。 4.数组作为函数参数 数组在传参的时候直接给数组名。
//0 1 2 3 4 5 6 7 8 9 a b c d e f //0 //1 //10 //11 //100 //1010 //1111 结论: (1)指针类型决定了指针在被解引用的时候访问几个字节 2.1指针+-整数 #include <stdio.h> //演示实例 int main() { int n = 10; char *pc = (char*)&n; int *pi = &n; printf ;//非法访问内存了,这里的p就是野指针 return 0; } 2.指针越界访问 #include <stdio.h> int main() { int arr[10] = {0}; int *p int main() { int a = 10; int* pa = &a;//pa是一个指针变量,一级指针变量 int** ppa = &pa;//ppa是一个二级指针变量 **ppa = int main() { int a = 10; int b = 20; int c = 30; int arr[10]; int* pa = &a; int* pb = &b; int
document.getElementById("canvas"); var context = canvas.getContext('2d'); var sW = 1; var lW = 4; var spacing = 10
以上是结构体传参的两种方式,我们可以比较得到,结构体地址传参比结构体传参好,因为结构体地址传参不用开辟新的空间,而是通过地址直接访问。因此,结构体地址传参更加高效。
引言书接上篇,Huazie 带大家了解了Go语言的《结构体类型》,本篇将要介绍Go语言的指针类型。主要内容指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。 Go语言既没有像Java语言那样取消了代码对指针的直接操作的能力,也避免了 C/C++ 语言中由于对指针的滥用而造成的安全和可靠性问题。Go语言的指针类型指代了指向一个给定类型的变量的指针。 指针类型是Go语言的复合类型之一。1. 类型表示法可以通过在任何一个有效的数据类型的左边加入 * 来得到与之对应的指针类型。 数据类型的知识就记到这,下一篇介绍 Go语言数据的使用。 最后附上知名的Go语言开源框架: Skynet: 一个分布式服务框架。它可以帮助我们构建起大规模的分布式应用系统。
指针和数组之间是什么关系呢? 指针变量就是指针变量,不是数组,指针变量大小是4/8字节,专门是用来存放地址的。 数组就是数组,不是指针,数组是一块连续的空间,可以存饭一个或者多个类型相同的数据。 联系: 1.数组中,数组名其实是数组数组首元素的地址,数组名 == 地址 == 指针。 2.当我们知道数组首元素的地址的时候,因为数组是连续存放的,所以通过指针就可以便利访问数组。 3.数组是可以通过指针来访问的。
最新的文档是:https://grpc.io/docs/languages/go/quickstart/ 比较旧的文档是:https://www.bookstack.cn/read/grpc-v1.0 /0.md 主要区别在于proto文件生成go文件,正确的是在examples/helloworld目录下执行: protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld/helloworld.proto 这样才能一次性生成两个文件,并且不会嵌套一堆目录
Go 语言变量作用域 作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。 Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函数定义中的变量称为形式参数 继续 具体了解局部变量、全局变量和形式参数。 package main import "fmt" // Go语言变量作用域 func main() { // 局部变量 a, b, c := 1, 2, 3 fmt.Printf ```java package main import "fmt" // Go语言变量作用域 // 全局变量 v
前言 牛牛又和大家见面了,本篇牛牛要讲的内容是c语言中有关数组的内容。 欢迎大家一起学习,共同进步。 补充小知识: 1.sizeof:c语言中的一个关键字,也是一种操作符。是用于计算数据在内存中所占的字节数。 1.4 一维数组的存储 数组在内存中是怎样存储的呢? 试着猜一下下面代码运行的结果: 补充小知识: strlen:C 语言中的库函数中的一种,用于计算字符串的长度,直到遇到结束字符(‘\0’),但不包括空格字符。 注意:C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。 建议我们在使用数组的时候要注意检查,数组是否越界。 { arr[i] = i; printf("%d ", arr[i]); } return 0; } 好了,今天c语言中有关数组的知识就牛牛讲到这里了。
十条有用的 Go 技术 这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践。我相信它们具有弹性的。这里的弹性是指: 某个应用需要适配一个灵活的环境。 的兼容性规则(http://golang.org/doc/go1compat)会处理代码。 你的代码总是能编译,并且在以后的 Go 的版本也可以保证这一点。只要在代码集中执行go vet,就可以发现所有的无标签的语法。 4. 10. 为访问 map 增加 setter,getters 如果你重度使用 map 读写数据,那么就为其添加 getter 和 setter 吧。 Go 天生就是个简单的语言,在大多数情况下只会有一种方法来作某事。简单是力量的源泉,也是为什么在人的层面它表现的如此有弹性。 如果必要的话,使用这些基数。
1、Go Reviverevive 是一个 Go 语言的代码质量检测工具(Linter for Go),具有快速、可配置、可扩展、灵活和美观等特性,可作为 golint 的替代方案。 IntelliJ + Go 插件 这是老牌的IDE了, 也是由JetBrains公司出品, 其本身是支持Java的, 要用作Go语言开发,就需要加上Go插件, 其插件支持基本的开发功能, 例如编译,调试 , 语法高亮,代码补全, 以及对引入库的管理,等等, 5、Gaia 无论是什么编程语言,我们都应该支持自动化,Gaia 是一个开源自动化平台,支持 DevOps,基于 HashiCorp的go-plugin 8、Eclipse+ Go插件 作为开放式IDE的鼻祖,Eclipse怎么可能少了对Go语言的支持, 把GoEclipse插件注册进去,其完整的开放功能就马上配备好。 10、VS Code+ Go插件 不再像以前那么霸道蛮横, 微软这么多年也算做了不少挽回人心的事, 而VSCode的推出, 就算其中一件.
2.1.C语言的汇编表示 c语言代码 int plus(int x,int y) { return 0; } void main() { __asm { mov eax,eax } int plus(int x,int y) { return x+y; } void main() { __asm { mov eax,eax //断点调试 F7,F5,右键Go 2.8.for循环 C语言代码 #include<stdio.h> #include<windows.h> void Myprint() { int i; for(i=0;i<10;i++) { ]; //10 char char* arr[10]; //10 指针(char*) 每个成员4字节 Point* arr[10]; //10 指针(Point*) 每个成员4字节 int ]; //8x10字节 Point* arrPoint[10; //4x10字节 4、数组指针的定义 int(*px)[5]; char(*px)[5]; //一维数组指针 int(*px)[5][4
闭包是主流编程语言中的一种通用技术,常常和函数式编程进行强强联合,本文主要是介绍 Go 语言中什么是闭包以及怎么理解闭包. 如果读者对于 Go 语言的闭包还不是特别清楚的话,可以参考上一篇文章 go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包. 或者也可以直接无视,因为接下来会回顾一下前情概要,现在你准备好了吗? func fibonacciByNormal() { a, b := 0, 1 for i := 0; i < 10; i++ { a, b = b, a+b 1 2 3 5 8 13 21 34 55 func TestFibonacci(t *testing.T) { f := fibonacci() for i := 0; i < 10 简单总结下闭包知识 闭包是一种通用技术,Go 语言支持闭包,主要体现在 Go 支持函数内部嵌套匿名函数,但 Go 不支持普通函数嵌套.
一、前言 最近在学习go,因为需要调用c语言打包成的so动态库里面的方法,避免自己再去造轮子,所以想直接使用golang调用so,但是参考了其他博客大佬写的,我每一步原封不动的写下来,结果都是一堆错误 二、环境 因为要将c语言打包,会需要借助gcc的工具,Windows 32位可以直接借助MinGW下载,Windows 64位用MinGW的话,后续打包运行的时候会报错,x86_64这样的错误 Linux:Centos7、gcc、go GOROOT:/opt/go GOPATH:/root/go 三、具体步骤 1、在我们的 $GOPATH/src 2、在目录下创建一个c语言的头文件 hi.h 内容如下: void hi(); 3、在目录下创建一个c语言的实现 hi.c 内容如下: #include <stdio.h> void ③、在 go build 的时候指定so的路径: go build -ldflags="-r ./" testc.go ok,到这里我们再次运行,成功! ?
-- 前置、后置 -- ++ 前置、后置 ++ * 间接访问操作符 ( 解引用操作符 ) ( 类型 ) 强制类型转换 单目操作符:只有一个操作数 C语言中 exp2 : exp3 10.逗号表达式 逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
Go 语言的异常处理语法绝对是独树一帜,在我见过的诸多高级语言中,Go 语言的错误处理形式就是一朵奇葩。 Go 语言的错误处理在业界饱受批评,不过既然我们已经入了这个坑,那还是好好蹲着吧。 错误接口 Go 语言规定凡是实现了错误接口的对象都是错误对象,这个错误接口只定义了一个方法。 第一个需要注意的是 os.Open()、f.Read() 函数返回了两个值,Go 语言不但允许函数返回两个值,三个值四个值都是可以的,只不过 Go 语言普遍没有使用多返回值的习惯,仅仅是在需要返回错误的时候才会需要两个返回值 体验 Redis 的错误处理 上面读文件的例子并没有让读者感受到错误处理的不爽,下面我们要引入 Go 语言 Redis 的客户端包,来真实体验一下 Go 语言的错误处理有多让人不快。 /practice/main.go:10 +0x122 exit status 2 上面的代码抛出了 negErr,直接导致了程序崩溃,程序最后打印了异常堆栈信息。
第10章处理错误 10.1 错误处理及Go语言的独特之处 在Go语言中,一种约定是在调用可能出现问题的方法或函数时,返回一个类型为错误的值。 要理解Go语言处理错误的方式,最重要的是明白函数ReadFile接受一个字符串参数,并返回一个字节切片和一个错误值。这个函数的定义如下。 在Go语言中,有一种约定是,如果没有发生错误,返回的错误值将为nil。 这让程序员调用方法或函数时,能够检查它是否像预期那样执行完毕。 10.2 理解错误类型 在Go语言中,错误是一个值。 panic.go:10 +0x79 exit status 2 调用panic后,程序将停止执行,因此打印This is not executed的代码行根本没有机会执行。 11.5 使用Goroutine处理并发操作 Go语言提供了Goroutine,让您能够处理并发操作。