Go Mod的官方说明 Go语言自从推出了go mod作为版本管理工具后,结束Go语言版本管理工具的纷争,实现了大一统。 相信有很多人都对这个版本管理的机制都有基础的概念、但并不深入。 快速入门 - 5篇介绍Go Mod系列的官方博客 新手直接阅读这篇文章的门槛有点高,我建议可以先看看下面这五篇较为通俗的官方博客,能帮助我们了解一些背景知识。 我个人感觉升级到v2这种方式不太友好,需要我们再维护一整个目录 5. module-compatibility https://blog.golang.org/module-compatibility mod init指令定义的库名 go - 要求go语言的最低版本,会影响到后面依赖库的下载 require - 必备库,也就是代码中直接import的部分 replace - 替换库,在重构时挺好用( 我经常会去手动编辑go.mod文件,然后用这个指令刷新一下依赖库 整理依赖go mod tidy 整理并更新go mod的依赖信息,保证当前的go.mod为最新。
2.C语言中函数的分类 1.库函数 2.自定义函数 2.1库函数 使用库函数,必须包含 #include 对应的头文件。 5.函数的应用 #include<stdio.h> //写一个函数可以判断一个数是不是素数。 //打印100~200之间的素数 //素数是只能被1和他本身整除的数 //7 //1和7整除 //2 3 4 5 6 // int main() { int i = 0; int count = 0 }; // 0 1 2 3 4 5 6 7 8 9 int k = 7; //找到了,返回下标 //找不到,返回-1 int ret = binary_search is_prime(i)) { printf("%d ", i); } } //printf("%d\n", sizeof(bool)); return 0; } 布尔类型是1个字节; 5.
注:本文是《Go语言核心编程》(李文塔/著)个人读书笔记 并发和并行是两个不同的概念: • 并行意味着程序在任意时刻都是同时运行的。 • 并发意味着程序在单位时间内是同时运行的。 goroutine 通过 go+匿名函数形式启动 goroutine 通过 go+有名函数形式启动 goroutine 特点 go 的执行是非阻塞的,不会等待 。 Go 程序在执行时会单独为 main 函数创建一个 goroutine ,遇到其他 go 关键字时再去创建其他的 goroutine 。 goroutine是Go语言里面的并发执行体,通道是 goroutine之间通信和同步的重要组件。 Go的哲学是“不要通过共享内存来通信,而是通过通信来共享内存”,通道是Go通过通信来共享内存的载体。
Go 语言常量 常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 多个相同类型的声明可以简写为: const c_name1, c_name2 = value1, value2 常量的应用: ```java package main import "fmt" // Go 语言常量 func main() { const LENGTH int = 10 const WIDTH int = 20 var area int const a, b
int arr[10]; int arr[10+5]; 在C99标准之前,数组的大小必须是常量或者常量表达式 在C99之后,数组的大小可以是变量,为了支持变长数组 1.2数组的初始化 数组的初始化是指 二维数组的创建和初始化 2.1 二维数组的创建 // 数组创建 int arr [ 3 ][ 4 ];//三行四列 char arr [ 3 ][ 5 ]; double / 数组初始化 int arr [ 3 ][ 4 ] = { 1 , 2 , 3 , 4 }; int arr [ 3 ][ 4 ] = {{ 1 , 2 },{ 4 , 5 }}; int arr [][ 4 ] = {{2,3},{4,5}}; // 二维数组如果有初始化,行可以省略,列不能省略 2.3二维数组的使用 对二维数组的理解。 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)指针类型决定了指针在被解引用的时候访问几个字节 避免返回局部变量的地址 5. 指针使用之前检查有效性 销毁指的是没有那一块内存的使用权限了,并不是没了。 4. 指针运算 4.1指针+-整数 #define N_VALUES 5 float values[N_VALUES]; float *vp; //指针+-整数;指针的关系运算 for (vp = &values 5.指针和数组 数组:一组相同类型元素的集合 指针:地址 指针变量:是一个变量,存放的是地址 数组可以通过指针来访问。 6.二级指针 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
以上是结构体传参的两种方式,我们可以比较得到,结构体地址传参比结构体传参好,因为结构体地址传参不用开辟新的空间,而是通过地址直接访问。因此,结构体地址传参更加高效。
指针和数组之间是什么关系呢? 指针变量就是指针变量,不是数组,指针变量大小是4/8字节,专门是用来存放地址的。 数组就是数组,不是指针,数组是一块连续的空间,可以存饭一个或者多个类型相同的数据。 联系: 1.数组中,数组名其实是数组数组首元素的地址,数组名 == 地址 == 指针。 2.当我们知道数组首元素的地址的时候,因为数组是连续存放的,所以通过指针就可以便利访问数组。 3.数组是可以通过指针来访问的。
本期给大家梳理下Go语言常量,常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 const identifier [type] = value 同时也支持多个相同类型的声明可以简写为: const c_name1, c_name2 = value1, value2 常量使用距离,实现Go // Proxy2G_ConnDataProto == 4 G2Proxy_SendDataProto // G2Proxy_SendDataProto == 5 总结:Go语言中没有枚举,所以一般在一定枚举都是用常量来定义。 ? Golang语言情怀 ID:wwwGolangLtd www.Golang.Ltd 游戏服务器架构丨分布式技术丨大数据丨Go语言学习
引言 上篇我们介绍了 Go 语言的 《数组类型》,本篇将介绍 Go 语言的切片类型。主要如下: 主要内容 切片可以看作是对数组的一种包装形式。切片包装的数组称为该切片的底层数组。 切片类型声明中的元素类型也可以是任意一个有效的 Go 语言数据类型。例如: []rune 如上用于表示元素类型为 rune 的切片类型。 同样可以把一个匿名结构体类型作为切片类型的元素类型。 "", 2: "Swift", 3: "Java", 4: "C", 5: "C++", 6: "PHP", 7: "", 8: "Go"} 3. "UltraEdit", "Eclipse"} sliceB := []string{"Vim", "Emacs", "LiteIDE", "IDEA"} 使用 Go 语言的内建函数 copy,将变量 变量 n1 的值为 3 , 变量 sliceA 的值被修改为: []string{"Vim", "Emacs", "LiteIDE"} 总结 本篇介绍了 Go 语言的 切片类型,下一篇介绍 Go 语言的字典类型
数组 实例 var arr1 [5]int //定义长度为5的数组 arr2 := [3]int{1,2,3} //使用:时需要赋值 arr3 := [...]int{2,3,4,5} //可变长度 var grid [4][5]int //二维数组 数组类型是值类型 调用func f(arr [10]int) 会拷贝数组 go语言中一般不直接使用数组 切片(Slice) 实例 arr := [...]int{0,1,2,3,4,5,6,7} s := arr[2:6] //s即为切片,值为[2 3 4 5] //Slice的写法 arr[2:6]= [2 3 4 5] arr[:6]= [0 1 2 3 4 5] arr[2:]= [2 3 4 5 6 7] arr[:]= [0 1 2 3 4 5 6 7] //------------------------------------ 11) s5 := append(s4, 12) s3, s4, s5 = [5 6 10] [5 6 10 11] [5 6 10 11 12] arr = [0 1 2 3 4 5 6 10] /
前言 牛牛又和大家见面了,本篇牛牛要讲的内容是c语言中有关数组的内容。 欢迎大家一起学习,共同进步。 补充小知识: 1.sizeof:c语言中的一个关键字,也是一种操作符。是用于计算数据在内存中所占的字节数。 1.4 一维数组的存储 数组在内存中是怎样存储的呢? 试着猜一下下面代码运行的结果: 补充小知识: strlen:C 语言中的库函数中的一种,用于计算字符串的长度,直到遇到结束字符(‘\0’),但不包括空格字符。 注意:C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。 建议我们在使用数组的时候要注意检查,数组是否越界。 { arr[i] = i; printf("%d ", arr[i]); } return 0; } 好了,今天c语言中有关数组的知识就牛牛讲到这里了。
2.1.C语言的汇编表示 c语言代码 int plus(int x,int y) { return 0; } void main() { __asm { mov eax,eax } 右键Go To Disassembly. // a = 100+(1x5) b = b + 5; // b = 100+(2x5) c = c + 5; // c = 100+(4x5) printf("%d % // a = 100+(4x5) b = b + 5; // b = 100+(4x5) c = c + 5; // c = 100+(4x5) printf("%d % ; char(*px)[5]; //一维数组指针 int(*px)[5][4]; //二维数组指针 5、数组指针的宽度与赋值 int(*px1) [5]; //一维数组指针 char(*px2) [3
--oschina Go语言中的5种常用加密技术 在数字时代,数据安全变得至关重要。Go语言以其简单、高效、易于部署的特点被广泛应用于服务器端编程。 今天,我们将探索Go语言在加密领域的5种常用函数,这些技术能帮助开发者保护用户数据,防止未经授权的访问。 1. MD5散列 MD5,即Message-Digest Algorithm 5,一度是最流行的散列函数之一,主要用于生成数据的指纹。 语言中的实现简洁高效,无论是开发Web应用、微服务还是任何需要安全措施的系统,都可以依靠它们确保数据的安全性。 希望本文能够帮助你在Go项目中实现更安全的数据处理。 安全是一个不断发展的领域,选择正确的加密方法和实践对保护你的应用至关重要。尽管某些散列函数如MD5已不再安全,但它们在非安全环境中仍然有其用处。
//3^3 = 0 -> a^a=0 //011 //011 //000 //0^5=5 -> 0^a = a //000 //101 //101 //3^3^5 = 5 //3^5^3 = 5 // // // printf("交换前:a=%d b=%d\n", a, b); // a = a ^ b;//a=3^5 // b = a ^ b;//3^5^5 --> b=3 // a = a ^ b;//3^5^3 --> a=5 // // printf("交换后:a=%d b=%d\n", a, b); // // return 0; //} // //int main() //{ // int a = 3; // int b = 5; // //这种方法会有溢出的问题 // printf("交换前:a=%d b=%d\n", a, b); // a = a + b; // b = -- 前置、后置 -- ++ 前置、后置 ++ * 间接访问操作符 ( 解引用操作符 ) ( 类型 ) 强制类型转换 单目操作符:只有一个操作数 C语言中
Go语言里有两种类型的接收者: 值接收者和指针接收者。 值接收者使用值的副本来调用方法,指针接收者使用实际值来调用方法。 5.3 类型的本质 5.3.1 内置类型 内置类型是由语言提供的一组类型。 5.3.2 引用类型 Go语言里的引用类型有如下几个:切片、映射、通道、接口和函数类型。当上声明述类型的变量时,创建的变量被称作标头值。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。 /listing36.go:32: cannot use u (type user) as type // notifier in argument to sendNotification 将工厂函数命名为New是Go语言的一个习惯。 即便内部类型是未公开的,内部类型里声明的字段依旧可以是公开的。当内部类型提升到了外部类型,这些公开的字段就可以通过外部类型的字段值来访问。
通常情况下语言入门前会讲一堆背景和特性,目的是为了能让学习者对该语言有一个大概的认识,但这里我想直接进入细节,不是因为任性,而是因为常量是编程语言最基本的组成元素,这与语言背景无关。 当然可以,要知道GO语言是最懂程序员的哟 :) const PI = 3.1415926535897932 const EluerE = 2.718281828459045 const value = GO是怎么区分常量/变量是对内还是对外的呢? ---- 【编后话】: 开始接触GO,感觉它就是一个大杂烩,里面即有C语言的影子,也有Java语言的影子,也有JavaScript脚本的影子,同时还有Pascal语言的痕迹,但使用使用着感觉这符合人的正常思维 借用知乎用户的话讲:GO语言是一门看似简单实际并不简单,貌似外表丑陋实则另有考究的语言。 ----
Go编程语言提供称为数组的数据结构,其可存储相同类型的元素的一个固定大小的连续集合。数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合。 声明数组 要声明在Go语言数组,程序员指定元素的类型以及如下的数组所需元件的数目: var variable_name [SIZE] variable_type 这就是所谓的一维数组。 初始化数组 你可以用一个Go初始化数组一个或者使用单一的声明如下: var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} 括号之间的数{}的值不能比声明方括号 = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109 数组是很重要的在Go语言中,应该需要了解更多的细节。 有下列关系到数组几个重要的概念Go程序员是应该清楚的: 概念 描述 多维数组 Go支持多维数组。
前言 本期是学习Golang的:切片高级用法及初级复习、Map、条件与循环语句入门学习,有不懂的地方可以评论进行讨论! 比如[2,3,4,5],索引为1的位置的出队,出队后切片为[2,4,5] 相关知识: 1、s|n| 切片s中索引位置为n的项 2、s|:| 从切片s的索引位置0到len(s)-1 处所获得的切片 3、s|low:| 从切片s的索引位置 low 到len(s)-1 处所获得的切片 4、s|:high| 从切片s的索引位置 0到high 处所获得的切片,len=high 5、s|low: high 相关知识: 1、for循环 2、break中断循环 3、append切片的追加 示例输入:[1,2,3,0,0,0],3,[2,5,6],3 示例输出:[1,2,2,3,5,6] 案例代码: / 你想要的这里都会有,十分适合小白和初学者入门学习~ 1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单 2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等 3、语言篇
切片无疑是 Go 语言中最重要的数据结构,也是最有趣的数据结构,它的英文词汇叫 slice。 所有的 Go 语言开发者都津津乐道地谈论切片的内部机制,它也是 Go 语言技能面试中面试官最爱问的知识点之一。初级用户很容易滥用它,这小小的切片想要彻底的理解它是需要花费一番功夫的。 Go 语言还提供了另一个种创建切片的语法,允许我们给它赋初值。使用这种方式创建的切片是满容的。 (s), cap(s)) } --------- [1 2 3 4 5] 5 5 Go 语言提供了内置函数 len() 和 cap() 可以直接获得切片的长度和容量属性。 函数 Go 语言还内置了一个 copy 函数,用来进行切片的深拷贝。