go语言

Go语言入门(五)结构体&练习

喜你入骨 提交于 2020-03-30 17:29:25
结构体&练习 结构体 定义 Go中的面向对象是通过 struct来实现的,struct是用户自定义的类型 //定义结构体 /定义结构体 type User struct { Name string Gender string Age int AvatarUrl string } func useStruct() { //初始化结构体1 var user1 User user1.Name = "jeson" user1.Gender = "male" user1.Age = 20 user1.AvatarUrl = "http://baidu.com" //初始化结构体2 user2 := User{ Name: "miky", Gender: "female", Age: 18, } fmt.Println(user1,user2) //空结构体 user3 := User{} fmt.Println(user3) } 结构体的特性 struct的内存布局:占用一段连续的内存空间 结构体没有构造函数,需要自己实现 //定义结构体 type User struct { Name string Gender string Age int AvatarUrl string } // 定义构造函数 func NewUser(name,gender string,age int,url

Go语言入门(六)结构体后续&指针

坚强是说给别人听的谎言 提交于 2020-03-30 17:25:16
结构体后续&指针 指针 变量和内存地址 每个变量都有内存地址,可以通过变量来操作对应的内存 func varMem() { var a int32 = 100 fmt.Printf("addr %p\n",&a) } func pointMem() { var b int32 b = 32 var a *int32 fmt.Printf("addr of a:%v\ntype of a %T\n",a,a) //取出a的地址和类型 a = &b fmt.Printf("a %d addr:%p\ntype of a:%T\nb %d addr %p\n",*a,&a,a,b,&b) } 指针的定义与取值 & : 取地址 * : 取指针对应的值 充分判断指针为nil的情况 func pointMem1() { var a *int b := 200 a = &b *a = 400 fmt.Printf("a=%v,adda=%p,type a=%#T\nb=%v,addb=%p,type b=%#T\n",*a,a,a,b,&b) } func pointMem2() { var a *int var b int = 100 if a == nil { a = &b } fmt.Printf("addr a=%p,value a=%d\naddr b=%p,value b=%d\n"

Go语言入门(七)goroutine和channel

99封情书 提交于 2020-03-30 17:23:54
goroutine和channel goroutine 多线程 func hello() { //fmt.Printf("Hello Goroutine!!\n") for i:=0;i<100;i++ { fmt.Printf("hello:%d\n",i) time.Sleep(time.Millisecond) } } func main() { go hello() //启动了一个独立的线程,使其与下面的代码交替执行,使之成为一个多线程 //fmt.Printf("main function\n") for i:=0;i<100;i++ { fmt.Printf("main:%d\n",i) time.Sleep(time.Millisecond) } time.Sleep(time.Second) //修复代码,使得主线程退出的时候子线程能执行 } 多个goroutine func nunmers() { for i :=0;i<=5;i++ { time.Sleep(time.Millisecond*250) fmt.Printf("%d\n",i) } } func chars() { for i:='a';i<='e';i++ { time.Sleep(time.Millisecond*400) fmt.Printf("%c\n",i) } } func main(

Go语言基础之指针

心已入冬 提交于 2020-03-28 12:38:02
前言 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 什么是指针 不管是Python还是Go程序 执行过程中数据载入内存后,在计算机内存中都有它们的内地址,这就是指针。 指针的作用就是 保存某1个数据在内存中的内存地址, 方便我们在内存中快速查找到该数据(变量)。 在Go语言中的 值类型 (int、float、bool、string、array、struct) 都有对应的指针类型 ,如: *int 、 *int64 、 *string 等。 指针操作 package main import "fmt" func main() { //基本数据类型在内存中的布局 var i int = 10 //获取变量i的内存地址 fmt.Println("变量i的内存地址:", &i) //声明1个 ptr指针变量,指向1个类型为int的内存地址 var ptr *int = &i fmt.Println(ptr) //获取指针的内存地址 fmt.Println(&ptr) //通过指针获取变量i对应的值(10) fmt.Println(*ptr) //通过指针修改变量i对应的值 *ptr = 222 fmt.Println(i) //通过指针修改变量的值 name := "成龙" age := "18" por1 := &name *por1 =

go语言周边

旧城冷巷雨未停 提交于 2020-03-27 23:11:28
博主收藏的go语言资料,分享一波~~~ 官网 https://golang.org/ (被墙) 镜像: http://docscn.studygolang.com/ 下载镜像: https://gomirrors.org/ Go Playground: https://play.studygolang.com/ https://play.yeyuqiu.com/ https://play.gopherd.com/ 提示:可以参考 https://github.com/golang/playground 搭建自己的Go Playground。 教程 astaxie/build-web-application-with-golang: A golang ebook intro how to build a web with golang https://github.com/astaxie/build-web-application-with-golang chai2010/advanced-go-programming-book: 《Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf插件实现、Web框架实现、分布式系统等高阶主题(完稿) https://github.com/chai2010/advanced-go-programming-book

Golang Channel详解

旧城冷巷雨未停 提交于 2020-03-27 18:07:14
3 月,跳不动了?>>> 感谢参考原文- http://bjbsair.com/2020-03-27/tech-info/7058/ 引言 Goroutine 和 Channel 是 Go 语言并发编程的两大基石。Goroutine 用于执行并发任务,Channel 用于 goroutine 之间的同步、通信。 在Golang的并发哲学里,有一句非常著名的话: Do not communicate by sharing memory; instead, share memory by communicating. 意思是:不要通过共享内存来通信,而要通过通信来实现内存共享,它依赖CSP(Communication Sequence Process) 模型,简称通信顺序进程。 Go提倡使用通信的方法代替共享内存,当一个Goroutine需要和其他Goroutine资源共享时,Channel就会在他们之间架起一座桥梁,并提供确保安全同步的机制。 Channel本质上还是一个队列,遵循FIFO(First In-First Out)原则, 创建通道 创建通道需要用到关键字 make ,格式如下: 通道实例 := make(chan 数据类型) 数据类型:通道内传输的元素类型。 通道实例:通过make创建的通道句柄。 使用通道 通道创建后,就可以使用通道进行发送和接收操作。 写入

Go语言编程之字符串处理函数

对着背影说爱祢 提交于 2020-03-27 09:33:49
整理记录一下Go语言的字符串常用函数 都需要导入strings包 1.Contains func Contains(s, str) bool 功能:字符串s中是否包含str,返回bool值示例: //查找一个字符串在另一个字符串中是否出现,str1 := "hello world"str2 := "llo"//Contains(被查找字符串,查找字符串)b := strings.Contains(str1, str2)fmt.Println(b)   //true 2.Join //字符串切片slice := []string{"123","web", "swq"}//字符串使用,连接 str := strings.Join(slice, ",") fmt.Println(str) 3.Index str1 := "hello world" str2 := "he" //查找一个字符串在另外一个字符串中第一次出现的位置 返回值是int类型,下标数 i := strings.Index(str1, str2) fmt.Println(i) 4.Repeat str1 := "go" //重复打印一个字符串3次 str2 := strings.Repeat(str1, 3) fmt.Println(str2)      来源: https://www.cnblogs.com

Go语言之Go 语言运算符

我是研究僧i 提交于 2020-03-26 23:50:55
Go 语言运算符 运算符用于在程序运行时执行数学或逻辑运算。 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍。 算术运算符 下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。 运算符 描述 实例 + 相加 A + B 输出结果 30 - 相减 A - B 输出结果 -10 * 相乘 A * B 输出结果 200 / 相除 B / A 输出结果 2 % 求余 B % A 输出结果 0 ++ 自增 A++ 输出结果 11 -- 自减 A-- 输出结果 9 以下实例演示了各个算术运算符的用法: 实例 **package** main **import** "fmt" func main() { **var** a int = 21 **var** b int = 10 **var** c int c = a + b fmt.Printf("第一行 - c 的值为 %d**\n**", c ) c = a - b fmt.Printf("第二行 - c 的值为 %d**\n**", c ) c = a * b fmt.Printf("第三行 - c 的值为 %d**\n**", c ) c = a / b fmt.Printf("第四行 - c 的值为 %d**\n**", c

go-并发

落爺英雄遲暮 提交于 2020-03-26 18:12:05
并发编程 并发与并行 并发:同一时间段内执行多个任务(交替执行)。 并行:同一时刻执行多个任务(一起执行)。 Go语言的并发通过 goroutine 实现。 goroutine 类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个 goroutine 并发工作。 goroutine 是由Go语言的运行时(runtine)调度完成,而线程是由操作系统调度完成的。 Go语言还提供 channel 在多个 goroutine 间进行通信。 goroutine 和 channel 是 Go 语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。 goroutine Go语言中的 goroutine 的概念类似于线程,但 goroutine 是由Go的运行时(runtime)调度和管理的。Go程序会智能地将 goroutine 中的任务合理地分配给每个CPU。Go语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。 在Go语言编程中你不需要去自己写进程、线程、协程,你的技能包里只有一个技能– goroutine ,当你需要让某个任务并发执行的时候,你只需要把这个任务包装成一个函数,开启一个 goroutine 去执行这个函数就可以了。 Go语言中使用 goroutine 非常简单

Go语言调度器之创建main goroutine(13)

空扰寡人 提交于 2020-03-23 16:42:36
本文是《Go语言调度器源代码情景分析》系列的第13篇,也是第二章的第3小节。 上一节我们分析了调度器的初始化,这一节我们来看程序中的第一个goroutine是如何创建的。 创建main goroutine 接上一节,schedinit完成调度系统初始化后,返回到rt0_go函数中开始调用newproc() 创建一个新的goroutine用于执行mainPC所对应的runtime·main函数,看下面的代码: runtime/asm_amd64.s : 197 # create a new goroutine to start program MOVQ $runtime·mainPC(SB), AX# entry,mainPC是runtime.main # newproc的第二个参数入栈,也就是新的goroutine需要执行的函数 PUSHQ AX # AX = &funcval{runtime·main}, # newproc的第一个参数入栈,该参数表示runtime.main函数需要的参数大小,因为runtime.main没有参数,所以这里是0 PUSHQ $0 CALL runtime·newproc(SB) # 创建main goroutine POPQ AX POPQ AX # start this M CALL runtime·mstart(SB) # 主线程进入调度循环