当前位置: 首页 > news >正文

Golang 学习 - 絮行

Golang

环境安装

官网下载:

https://golang.google.cn/dl/

Windows 安装

  • 下载 .msi

  • 一路 Next

  • 默认会装在:

    C:\Program Files\Go
    

Linux / macOS

tar -C /usr/local -xzf go1.21.x.linux-amd64.tar.gz

配置环境变量

Windows

确认有:

GOROOT = C:\Program Files\Go
PATH   += C:\Program Files\Go\bin

终端验证:

go version

看到类似:

go version go1.21.6 windows/amd64

说明成功 🎉

优势:

  • 简单的部署方式

  • 静态类型的语言

  • 语言层面的并发

  • 强大的标准库

  • 简单易学

不足:

  • 泛型引入较晚且相对复杂: 虽然 Go 1.18 终于引入了泛型,但相比 Java 或 Rust,其实现较为克制,部分复杂逻辑表达起来依然略显冗长。
  • 错误处理方式争议大: Go 坚持使用 if err != nil 的显式错误处理。这虽然保证了代码的可读性,但会导致代码库中充斥着大量的重复检查代码。
  • 生态系统虽然强,但有偏向性: 在云原生、后端、微服务领域无敌,但在图形界面(GUI)、科学计算、数据分析或深度学习领域,生态远不如 C++ 或 Python。
  • 内存管理不够精细: 相比 Rust 这种无 GC 的语言,Go 的垃圾回收在极高并发或对延迟极其敏感的情况下,可能会引起微小的波动(STW 问题)。

Golang语法

第一个go源文件:

package main  
//Go 里有两种东西:库(package)程序(可执行文件)只有 package main 才能编译成可执行程序// import "fmt"
import ("time""fmt"
)  //到多个包使用括号()// main函数func main() {		//函数后的花括号必须与函数名在同一行fmt.Println("hello Go!")   //加不加分号都是可以的time.Sleep(1 * time.Second)
}

变量的声明

声明变量的一般形式是使用 var 关键字

有四种方式:

package main
/*四种变量的声明方式
*/
import("fmt"
)// 声明全局变量,不能使用方法四
var gA = 102
var gB = "abd"// gL := 103func main(){//方法一:声明一个变量 默认值为0var a int fmt.Println("a = ",a)fmt.Printf("Type of a = %T\n",a)//方法二:声明一个变量,初始化一个值var b int = 100fmt.Println("b = ",b)fmt.Printf("Type of b = %T\n",b)var bb string = "abcd"fmt.Printf("bb = %s Type of bb = %T\n",bb,bb)//方法三:在初始化的时候。可以省去数据类型,通过值自动匹配当前的变量的数据类型var c = 100fmt.Println("c = ",c)fmt.Printf("Type of c = %T\n",c)var cc = "aaaa"fmt.Printf("cc = %s , Type of cc = %T\n",cc,cc)//方法四:常用方法,省去var关键字,直接自动匹配e := 101fmt.Printf("e = %d\n",e)fmt.Printf("Type of e = %T\n",e)f :="kkkk"fmt.Println("f = ",f)fmt.Printf("Type of f = %T\n",f)g := 1.12fmt.Println("g = ",g)fmt.Printf("Type of g = %T\n",g)fmt.Println("gA = ",gA, "gB = ",gB)// fmt.Println("gC = ",gC)//声明多个变量var xx, yy int = 111,222fmt.Println("xx = ",xx, "yy = ",yy)var kk,ll = 113,"lll"fmt.Println("kk = ",kk, "ll = ",ll)//多行声明多个变量var (vv int = 151oo = "rar"pp = true)fmt.Println("vv = ",vv ,"oo = ",oo ,"pp = ",pp)
}

常量

package mainimport "fmt"
const a = 100func main(){fmt.Println("常量:a = ",a)const(a,b = 1 + iota , 2 + iota c,de,fg,h = 3 * iota , 4 * iotai,j)fmt.Println("a= ",a,"b = ",b)fmt.Println("c= ",c,"d = ",d)fmt.Println("e= ",e,"f = ",f)fmt.Println("g= ",g,"h = ",h)fmt.Println("i= ",i,"j = ",j)const(beijing = iota + 1shanghaiwuhan)fmt.Println("beijing = ",beijing)fmt.Println("shanghai = ",shanghai)fmt.Println("wuhan = ",wuhan)
}
输出:
常量:a =  100
a=  1 b =  2
c=  2 d =  3
e=  3 f =  4
g=  9 h =  12
i=  12 j =  16
beijing =  1
shanghai =  2
wuhan =  3iota   逐行自增长

函数

package mainimport "fmt"// 函数名后写返回类型 也可以是多个返回值,可以匿名,也可以写返回形参func foo1(a string, b int) {fmt.Println("=========foo1========")fmt.Println("a = ",a)fmt.Println("b = ",b)
}func foo2(a string, b int) int{fmt.Println("=========foo2========")fmt.Println("a = ",a)fmt.Println("b = ",b)c :=100return c
}func foo3(a string, b int) (r1 int,r2 int){  //也可以写成 (r1, r2 int)fmt.Println("=========foo3========")fmt.Println("a = ",a)fmt.Println("b = ",b)fmt.Println("r1 = ",r1)fmt.Println("r2 = ",r2)r1 = 9999r2 = 6666return
}func swap(a string,b string) (string,string){return b,a
}func main() {foo1("aaa",99)l := foo2("dddd",123)fmt.Println("this l = ",l)ret1,ret2 := foo3("ssss",123)fmt.Println("ret1 =",ret1, "ret2 = ",ret2)p,q :=swap("aac","bdd")fmt.Println("p=",p,"q=",q)
}

main函数与init函数:

main函数只能在package main中,init函数不是,而且init函数可以在同一个package中出现多次

它们在定义时不能有任何的参数和返回值

Go程序会自动调用它们

程序的初始化和执行都始于main包

image

导入包时:

在项目文件夹运行:go mod init GolangTraining

初始化,导入的时候就可以 GolangTraining/…

package mainimport ("fmt"aa "GolangTraining/lib1"bb "GolangTraining/lib2"
)
func init(){fmt.Println("this main init")
}
func main(){aa.Lib1Test()bb.Lib2Test()fmt.Println("this main")
}有些时候,你并不需要调用那个包里的任何函数,你只需要它产生的“副作用”。 
在 Go 中,导入一个包最主要的“副作用”就是:触发该包内所有 init() 函数的执行。当你写 _ "GolangTraining/lib1" 时,你是在告诉编译器:“我知道我没在代码里显式调用这个包,但请帮我把它编译进去,并执行它的 init() 函数,别报错删掉它。”
不加下划线:表示你要使用这个包里的工具(如 lib1.MyFunction())。
加下划线:表示你只想要这个包“初始化”一下(执行 init()),之后你就当它不存在。还可以起个别名,aa之后通过aa.方法来调用或者import . "fmt" 将fmt包中全部方法导入到当前包中,就不用通过fmt来调用(不建议)
package InitLib1import "fmt"func Lib1Test() {fmt.Println("Func Lib1")
}func init() {fmt.Println("lib1")
}
package InitLib2import "fmt"func Lib2Test() {fmt.Println("Func Lib2")
}func init() {fmt.Println("lib2")
}

指针:

package mainimport "fmt"
func changeV1(p int){p=10
}func changeValue(p *int){fmt.Println("this is p = ",&p)*p=10
}func main() {var a = 999changeV1(a)fmt.Println("this is a = ",a)changeValue(&a)fmt.Println("this is a adderr = ",&a)fmt.Println("this is a = ",a)// fmt.Println("this is a = ",&a)
}输出:
this is a =  999
this is p =  0xc00006a068
this is a adderr =  0xc00000a0f8
this is a =  10

image 1

http://www.jsqmd.com/news/366940/

相关文章:

  • 2026年质量好的印花布箱包布/卡通布箱包布公司口碑推荐哪家靠谱 - 行业平台推荐
  • FLUX.1+SDXL风格:AI绘画零基础快速上手
  • Hunyuan-MT 7B翻译工具评测:小语种翻译效果惊艳
  • M00031:机械臂凯恩方法建模与控制算法研究及应用探索
  • Spark批处理认知——RDD与DataFrame的差异、Shuffle与资源利用
  • 2026国内最新最新衣柜专用板材十大源头厂家推荐!山东等地优质环保/实木/ENF级/抗菌防霉板材品牌权威榜单发布 - 品牌推荐2026
  • 2026年质量好的液体防沉触变剂/触变剂哪家靠谱可靠供应商参考 - 行业平台推荐
  • Qwen3-TTS-Tokenizer-12Hz新手必看:从零开始学习音频编解码
  • AI画室体验:圣光艺苑生成星空风格作品全流程
  • MedGemma X-Ray应用场景:医学院解剖课AI助教——实时解析X光解剖结构
  • 哪个老师讲的临床执医考点更好记 - 医考机构品牌测评专家
  • Qwen3-Reranker-0.6B效果实测:提升检索准确率40%
  • 2026年2月色选机厂家推荐,大型产能分选设备厂商实力盘点 - 品牌鉴赏师
  • 2026年比较好的脱硫脱硝催化剂/蜂窝式脱硝催化剂工厂采购指南如何选(实用) - 行业平台推荐
  • 模板匹配,基于形状的模板匹配,速度直逼halcon,openCV实现,C++/C#,32/64位
  • 2026年评价高的粘结钕铁硼塑磁/注塑磁哪家质量好厂家推荐(实用) - 行业平台推荐
  • 2026年2月检针机直销厂家,技术过硬售后完善 - 品牌鉴赏师
  • 快速部署Qwen3-TTS:打造属于你的智能语音助手
  • 阿里云Qwen3-ASR-1.7B:复杂环境下的语音识别方案
  • GTE文本向量-large效果展示:中文古诗文本情感分析+作者风格分类联合建模
  • Swin2SR实际应用:社交媒体头像无损放大服务
  • 2026年热门的闭式冷却塔/闭式循环水冷却塔直销厂家采购指南如何选 - 行业平台推荐
  • 零基础入门:手把手教你使用QWEN-AUDIO制作自然语音
  • 小白也能用的专业工具:Nano-Banana Studio现代化UI,实时预览超友好
  • 5分钟搞定:Qwen3-ASR语音识别工具的快速部署
  • 零基础入门:浦语灵笔2.5-7B图文理解模型实战指南
  • 常州心理咨询哪家强?一文读懂如何科学选择心理服务 - 野榜数据排行
  • 3步搞定EcomGPT:电商领域大模型快速入门
  • 游戏开发者看过来:Local AI MusicGen生成8-bit游戏音乐
  • Qwen3-ASR-1.7B新特性:FP16优化+自动语种检测详解