Go语言探索第一天,学习笔记

《Go语言基础入门》 第一章: 开始第五章: 数组与切片第六章: 映射与结构体第七章: 方法与接口第八章: 并发编程第十章: 错误处理。 阅读详情

        已经在大数字做了三年的windows C++开发了,坦白的讲,自己现在还是个小码农。深深的感到自己是个loser。如今,大家回家后鲜有打开电脑玩电脑的人,与09年我刚

上大学那会儿乃至13年刚入职的时候相比,堪称沧海桑田~互联网节奏太快了,windows终端目测已经沦陷,转瞬间就变成了移动端的天下。想起之前学习汇编,windows PE

文件,hook,线程注入等各种windows技能,对新技术的嗤之以鼻,如今对自己感到了呵呵。期间自己学过了PHP,JS,甚至安卓SDK NDK。学了不实践,两天忘光光。作为一个小码农,如今感到一丝彷徨迷茫,竟不知未来何去何从。

       经过自己两天辗转反折的思考,感觉自己应该学习点服务端的知识,这个方面好友早就提醒过我多次,之前的我竟然执迷不悟。

我们部门的服务端开发语言百花齐放,lua,PHP,python,GO,四大阵营,这个也归结于领导的包容并收。听人说GO效率要比C\C++高,我听到了差点没笑掉大牙。但我深

深的知道,GO是个很牛逼的东西。决定在业余时间探索一下这个东西。   GO大道至简,开发环境搭建也就是解压缩,配置环境变量两个步骤而已。对了据说他吸收了各种语言的优点,摒弃了各种语言的缺点。到底是不是这么回事呢?我们来一点点探索吧~


系统变量名:

GOROOT

值:

Go的安装位置


系统变量名:

Path

追加值:

;%GOROOT%\bin







开发环境安装包在此 https://yunpan.cn/cRzWuKqjn9MIV  访问密码 a41e。



cmd 输入go   打印出如下一大堆信息,那么恭喜你,环境搭建成功了。然后让我们开始写自己的第一个GO程序吧~




package main


import "fmt"


func main() {


fmt.Printf("HelloWorld!")


}


代码注意:

func main(){

不可以写成

func main()

{

这个不仅仅是代码规范,Go为了统一编码风格的语法。


保存文件名为 gofirst.go


编译 go build gofirst.go


这个时候你会在gofirst.go目录下发现多了一个文件


拖入cmd黑框框执行,。

唔?生成的文件竟然有1942KB这么大!!!为啥子文件会这么大?难道Go会不再沿用windows PE结构?答案是否定的。

UE看了下Go交叉编译器生成的二进制文件,标准的win PE文件,很显然,代码段和资源段增加了不少内容。瑕不掩瑜,这可能是谷歌为了解决某种问题不得不这么做的吧。




IDA看了看,显然,为了输出一个hello world   Go在初始化的时候做了不少工作。


没错,至少在输出Hello World方面。GO语言应该会比C语言慢个几十倍。  但它不是生来输出Hello World的。另外他是一种编译型语言,而且生成windows的标准WinPE文件。同理 *nix的标准执行文件。我们有理由相信,在大型项目上,抛开内存垃圾回收机制不讲,(语言自动管理垃圾回收机制,势必会对速度有一丁点影响)Go完全有理由媲美C、C++,还会大大降低开发的难度,我们有好多理由去好好了解下这么语言。



为了给大家展示一下Go语言媲美C语言的能力,我们写一个Go语言的   Windows MessBox程序。代码如下,唔~第一天写go程序,这段代码是copy自网络哦。为的是证明C能做到的,GO同样能做到,效率还不会太低哦。


package main
import (
       "syscall"
       "unsafe"
       "fmt"
)
func abort(funcname string, err int) {
       panic(funcname + " failed: " + syscall.Errno(err).Error())
}
var (
       kernel32, _ = syscall.LoadLibrary("kernel32.dll")
       getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")
       user32, _ = syscall.LoadLibrary("user32.dll")
       messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")
)
const (
       MB_OK                      = 0x00000000
       MB_OKCANCEL                = 0x00000001
       MB_ABORTRETRYIGNORE        = 0x00000002
       MB_YESNOCANCEL             = 0x00000003
       MB_YESNO                   = 0x00000004
       MB_RETRYCANCEL             = 0x00000005
       MB_CANCELTRYCONTINUE       = 0x00000006
       MB_ICONHAND                = 0x00000010
       MB_ICONQUESTION            = 0x00000020
       MB_ICONEXCLAMATION         = 0x00000030
       MB_ICONASTERISK            = 0x00000040
       MB_USERICON                = 0x00000080
       MB_ICONWARNING             = MB_ICONEXCLAMATION
       MB_ICONERROR               = MB_ICONHAND
       MB_ICONINFORMATION         = MB_ICONASTERISK
       MB_ICONSTOP                = MB_ICONHAND
       MB_DEFBUTTON1              = 0x00000000
       MB_DEFBUTTON2              = 0x00000100
       MB_DEFBUTTON3              = 0x00000200
       MB_DEFBUTTON4              = 0x00000300
)
func MessageBox(caption, text string, style uintptr) (result int) {
       // var hwnd HWND
       ret, _, callErr := syscall.Syscall6(uintptr(messageBox), 4,
               0, // HWND
               uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), // Text
               uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), // Caption
               style, // type
               0,
               0)
       if callErr != 0 {
               abort("Call MessageBox", int(callErr))
       }
       result = int(ret)
       return
}
func main() {
       defer syscall.FreeLibrary(kernel32)
       defer syscall.FreeLibrary(user32)
       fmt.Printf("Retern: %d\n", MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL))
}
func init() {
       fmt.Print("Starting Up\n")
}


来来来,保存为messagebox.go

执行命令go build messagebox.go



同样文件不小,也许是包含了调试信息?  这个我们之后再进行探索。运行结果如下



注意,我们调用了

 kernel32, _ = syscall.LoadLibrary("kernel32.dll")
       getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")
       user32, _ = syscall.LoadLibrary("user32.dll")
       messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")


看出来没,这和C\C++调用一个微软的Api如出一辙。都是获取了MessageBox在内存的地址,然后

func MessageBox(caption, text string, style uintptr) (result int) {
       // var hwnd HWND
       ret, _, callErr := syscall.Syscall6(uintptr(messageBox), 4,
               0, // HWND
               uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), // Text
               uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), // Caption
               style, // type
               0,
               0)
       if callErr != 0 {
               abort("Call MessageBox", int(callErr))
       }
       result = int(ret)
       return
}



关看代码就可以知道GO调用MessageBox,和C、c++进行了完全一样的步骤。syscall.Syscall6到底做了点什么~  想必也就是简单的获取syscall.Syscall6的第一个参数 messbox在windows内存中位置(二进制代码段的位置),获取第二个参数,这个表明了被调用的MessageBox有四个参数,也就是push四次,然后分别取出后面的四个参数进行压杖,最后call

push style

push caption

push text

push 0

CALL messageBox




不过我好奇的是,我简单的弹一个messagebox,但是这个进程却启动了6个线程




抛开搜狗输入法注入可能启动的线程不说,起码在·GO编译出来的代码中,也就是

内存偏移 messagebox.exe+0X4af80和messagebox.exe+0X4b240这个地方的线程,理论上讲是Go语言生成的。

莫非这几个线程就是为了Go语言高并发设计的线程池?

我们以后慢慢来深入学习,看看Go语言葫芦里到底有什么药。

       





Golang学习笔记(五):Go语言与C语言的区别 Golang学习笔记(五):Go语言与C语言的区别1 概述2 Go语言与C语言的区别2.1 行尾分号 1 概述 上一章节《Golang学习笔记(四):Go原始设计思想及核心特性》提到过,Go语言是“以C语言为原型,修补部分明显的缺陷,去掉垃圾功能,添加一些缺失的功能”而设计的。本章节就总结一下Go语言与C语言的区别。 本文主要参考:http://hyperpolyglot.org/c 以及 htt... 阅读详情

相关推荐

【云原生 37】Docker快速部署编程语言Golang_docker go运行环境

🏅云计算领域优质创作者🏅。

2401_89317520的博客 1373

零基础小白如何学习go语言,10分钟带你入门

但是 Go 语言更是对 C 语言最彻底的一次扬弃,它舍弃了 C 语言中灵活但是危险的指针运算,还重新设计了 C 语言中部分不太合理运算符的优先级,并在很多细微的地方都做了必要的打磨和改变。下划线_是一个特殊的标识符,称为空白标识符,它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用_作为变量对其它变量进行赋值或运算。切片是可以动态双倍扩容的,使用的是数组内置的添加,复制功能。列表的底层数据结构是双向链表。

weixin_56242987的博客 2805

【Golang】深入探索Go语言中的网络编程实现方式

Go语言作为一种简洁而强大的编程语言,在网络编程方面表现尤为出色。其内置的net包提供了丰富的网络I/O基础设施,支持TCP、UDP协议,以及DNS解析等功能。 TCP提供可靠的、面向连接的通信,适用于需要确保数据传输完整性的场景。而UDP提供无连接的快速数据传输,适用于实时性要求较高但对数据完整性要求不高的场景。 Go语言的并发模型基于轻量级的goroutines和channels。每个网络请求都可以在自己的goroutine中处理,实现高效的并发。Channels用于在goroutines之间安全地

景天科技苑 5万+

数据结构STL——golang实现vector

github仓库存储地址:https://github.com/hlccd/goSTL 概述 ​ 向量(Vector)是一个封装了动态大小数组的顺序容器。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 ​ 对于vector的实现,考虑到它是一个线性容器,其中的元素可以通过下标在O(1)的时间复杂度直接获取访问,可以考虑底层使用数组的形式实现。由于vector可以动态的添加和删除元素,所以需要对数组进行动态分配以满足需求。 ​ 对于golang语

l2975的博客 1110

go_vector是基于C ++ std :: Vector的容器数据结构。 go_vector带来了功能编程,并删除了样板代码。-Golang开发

GoVector版本1.2.0 go_vector是基于C ++ std :: Vector的容器数据结构。 go_vector带来了功能编程,并删除了样板代码。 代码示例*来自文档/ examples / mai GoVector版本1.2.0的片段go_vector是基于C ++ std :: Vector的容器数据结构。 go_vector带来了功能编程,并删除了样板代码。 代码示例*摘自文档/examples/main.go*中的片段*构造一个空的向量var播放器GoVector.Vector播放器= players.Init()追加一个元素player.PushBack(newPlayer)删除一个元素player.RemoveAt(index)获取元素在索引播放器处At(index)在索引播放器处Set元素.SetAt(index)映射函数pl

go-vector:用于 go 的简单 2d 矢量库

去向量 用于 go 的简单 2d 矢量库

Golang中的string与C++中unicode字符互转

func Str2uft16ptr(str string)(p uintptr){//将字符串转为utf16指针 e:=utf16.Encode([]rune(str))//转成unicode e=append(e, uint16(0))//添加末尾的0 p=uintptr(unsafe.Pointer(&e[0]))//转成指针 //p=uintptr(unsafe.Pointe...

rtduq的博客 2615

实验六 有源滤波器

实验六 有源滤波器一、实验目的二、仪器及设备三、预习要求画出三个电路的幅频特性曲线。四、实验内容l.低通滤波电路2.高通滤波电路3.带阻滤波电路(1)实测电路中心频率。(2)以实测中心频率为中心,测出电路幅频特性。五、实验报告六,仿真图:图 1 低通滤波器仿真图图 2 高通滤波器仿真图图 3 带阻滤波电路仿真图 一、实验目的 1.熟悉有源滤波电路构成及其特性。 2.学会测量有源滤波电路幅频特性。 二、仪器及设备 1.示波器 2.信号发生器 三、预习要求 1.预习教材有关滤波电路

胡毛毛的博客 1万+

golang的syscall调用windows的DLL库

golang的syscall调用windows的DLL库 package main import ( "fmt" "syscall" "time" ) func main() { //加载动态库 u32, err := syscall.LoadLibrary("user32.dll") if err!=nil { abort("LoadLibrary", err.Error()) } defer syscall.FreeLibrary(u32) //获得动态库方法 getActi

可克技术 3645

Gazebo仿真平台模型搭建与修改

ROS里踩过的坑(一)Gazebo仿真平台模型搭建与修改文件讲解Models 文件World文件Launch文件模型编辑可视化编辑配置文件编辑模型展示如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

Redglass的博客 1万+

VSCode配置ClangFormat:让C++大括号乖乖不换行(附常见样式对比)

本文详细介绍了如何在VSCode中配置ClangFormat,实现C++代码大括号不换行的格式化风格。通过对比Attach、Allman等主流大括号样式,并提供从快速设置到项目级配置的完整指南,帮助开发者打造统一、高效的代码格式化工作流,提升团队协作效率。

weixin_28835551的博客 215

[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及

作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入,驾驭~ 这些年我学过各种编程语言,从最早的C语言到C++,再到C#、PHP、JAVA,再到IOS开发、Python,到最新的GO语言,学得是真的杂。有时

杨秀璋的专栏 12万+

Confluence安装Drawio插件

记录confluence安装drawio插件步骤

devotedwife的博客 7377

【Go之道】探索Go语言之旅:基础与进阶指南

Go语言是一门强大而简单的编程语言,适用于各种应用领域。无论你是初学者还是有经验的开发人员,Go都值得学习。希望这篇入门介绍可以帮助你开始学习Go,并探索其丰富的功能和库。祝你编程愉快!

颜淡慕潇 3万+

超10万,两台Mac Studio在家就能跑满血DeepSeek,网友:这是性价比最高的大模型一体机

在AI计算领域,没有比这更强的个人电脑了。这要从它的架构说起。对于那些有本地部署满血版DeepSeek需求的用户,目前建议的配置是选购512GB统一内存 + 1TB SSD,搭载M3 Ultra芯片的Mac Studio,官网售价74249元,可以叠加国补、教育优惠、12期分期等,这可能是目前门槛最低、性价比最高的满血版DeepSeek本地部署方案。对于企业而言,尽管Mac Studio确实可以部署6000亿参数的大模型,但在内存带宽、模型精调服务等方面,跟专用的大模型一体机仍有差距,采购需要谨慎评估。

2501_90444774的博客 1914

Ollama内网离线部署大模型实战:从模型文件到私有化服务

本文详细介绍了如何在内网离线环境下,利用Ollama部署私有化大模型服务。内容涵盖从获取GGUF格式模型文件、手动安装Ollama、编写核心Modelfile配置文件,到创建运行模型、性能调优及安全加固的全流程实战指南,旨在帮助企业安全、可控地构建内部AI能力。

weixin_29209805的博客 213

100天精通Golang(基础入门篇)——第1天:学习Go语言基本概念

100天精通Golang(基础入门篇)——第1天:学习Go语言基本概念,欢迎来到100天精通Golang的基础入门篇!在这个系列教程中,我们将带领你逐步掌握Go语言的核心概念和语法。本篇博文将着重介绍Go语言的基本概念,包括其定义、用途和优势。通过阅读本文,你将对Go语言有一个清晰的了解。在第1天的学习中,我们将探索Go语言的基本概念。我们将介绍Go语言是什么,它可以用来做什么,以及它相较于其他编程语言的优势。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 6万+

关于爬虫源影视资源设置

本文介绍了Omnibox 2.1.3版本的爬虫脚本配置方法,重点演示了如何添加猫眼资源数据源。脚本包含完整的API请求处理、数据格式化、视频详情获取和弹幕匹配等功能模块。通过环境变量配置采集站API地址和弹幕API地址,支持视频列表获取、分类检索、详情查询和播放地址解析等功能。脚本采用模块化设计,包含完善的错误处理和日志记录机制,能够将采集站返回的数据转换为标准格式,并支持批量获取视频详情来丰富数据。同时提供了弹幕匹配功能,可根据视频文件名或播放地址自动匹配相关弹幕资源。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 4650

Go 和 Golang 有什么关系?

大家好,我是煎鱼。最近天气也冷了,掐指一算是招聘季了,无论是校招、社招、HR、面试官们都蠢蠢欲动。这不,我有一个朋友的 HR 朋友都有起名困难了,一看 Go 语言的工作说明(Job Des...

EDDYCJY的博客 1万+

(ICLR 2025)【源码讲解+复现】TIMER-XL: Long-Context Transformers for Unified Time Series Forecasting

本文提出了一种统一的多变量时序预测模型Timer-XL,其核心创新包括:1)采用自回归解码器架构,将多变量时序预测统一为next-token预测问题;2)设计TimeAttention机制,通过相对位置编码和因果掩码捕获时序位置和变量间交互;3)支持长上下文预训练以提升零样本迁移能力。模型架构包含嵌入层、时间感知注意力块和预测头,采用MSE损失进行端到端训练。实验表明该方法在多种时序任务上表现优异,特别是在长跨度预测和少样本场景下。代码实现提供了完整的模型定义、数据加载和训练流程,支持自定义配置参数。

1145

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Golang】三分钟让你快速了解Go语言&为什么我们需要Go语言?

Go编译速度快的几个原因使用import引用管理方式没有模板编译负担1.5版本后编译器的优化语言本身关键字很少。

Yaoyao2024的博客 3687

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【小tips】这门语言是叫 Go 还是 Golang?

到底是Go语言还是Golang语言?来看看官方解释吧

m0_60511809的博客 3022

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Golang学习笔记(上)

func 函数名(形式参数列表)(返回值列表) {函数体。

weixin_57242378的博客 1878

【亲测免费】 探索LLaMA.go:用Golang实现的大语言模型推理框架

**相关项目**: - [FastTensors](https://github.com/gotzmann/fast) - [Booster](https://github.com/gotzmann/booster)

gitblog_00955的博客 1709

Golang Go 语言简介

1. Go语言是什么 “Go 是一种开源的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效率的软件”(来自 go 官网 golang.org) Go 语言是 Google 开发的开源编程语言,于 2006年1月2日15点4分5秒 诞生,2009年11月 开源,2012年发布 go 稳定版。 go 的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。 我们程序员在开发程序,开发软件时都会选择一门编程语言,那么我们应该怎样进行选择呢?可能有同学会说,我

李培冠的博客 1万+

golang go语言_Go(Golang)编程语言

golang go语言Go (or golang) is a programming language created at Google in 2007 by Robert Griesemer, Rob Pike, and Ken Thompson. It is a compiled, statically-typed language in the tradition of Algol and...

cumian8165的博客 1070
上一篇: 排序
下一篇: Windows RPC 远程过程调用
VectorC0de
博客等级 码龄14年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值