Golang go语言基础篇

初学者这样玩 TypeScript,迟早进大厂系列(第九期) 极客江南: 一个对开发技术特别执着的程序员,对移动开发有着独到的见解和深入的研究,有着多年的iOS、Android、HTML5开发经验,对NativeApp、HybridApp、WebApp开发有着独到的见解和深入的研究, 除此之外还精通 JavaScript、AngularJS、 NodeJS 、Ajax、jQuery、Cordova、React Native等多种Web前端技术及Java、PHP等服务端技术。 初学者玩转 TypeScript系列,总计 10 期,本文为第 9 期,点赞、收藏、评论、. 阅读详情

1. 语法

var name type

Go语言的基本类型有:

  • bool
  • string
  • int、int8、int16、int32、int64
  • uint、uint8、uint16、uint32、uint64、uintptr
  • byte // uint8 的别名
  • rune // int32 的别名 代表一个 Unicode 码
  • float32、float64
  • complex64、complex128

2. 函数

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

func hypot(x, y float64) float64 {

return math.Sqrt(x*x + y*y)

}

func typedTwoValues() (int, int) {
    return 1, 2
}

代码管理对比

  • Go语言中通过包来管理代码
    • Go语言没有.h文件的概念, 在Go中想使用某一个函数时, 只需要import导入对应的包即可
  • Go语言中函数、变量公私有管理
    • 通过函数名称首字母大小写实现是否公开函数
    • 通过变量名称首字母大小写实现是否公开变量

常量变量对比

  • Go语言定义常量和变量格式
    • 除了以下标准格式外,Go语言还提供了好几种简单的语法糖
var 变量名称 数据类型 = 值;
const 变量名称 数据类型 = 值;

运算符对比

  • 算数运算符和C语言几乎一样
    • Go语言中++、--运算符不支持前置
      • 错误写法: ++i; --i;
    • Go语言中++、--是语句,不是表达式,所以必须独占一行
      • 错误写法: a = i++; return i++;

流程控制语句对比

  • C语言流程控制中的if、switch、for在Go语言都可以使用
  • C语言中的四大跳转语句return、break、continue、goto在Go语言都可以使用
  • Go语言除了实现C语言中if、switch、for、return、break、continue、goto的基本功能以外,还对if、switch、for、break、continue进行了增强
    • 例如: if 条件表达式前面可以添加初始化表达式
    • 例如: break、continue可以指定标签
    • 例如: switch语句可以当做if/elseif来使用
    • ... ...
  • 值得注意的是Go语言中没有while循环和dowhile循环, 因为它们能做的Go语言中的for循环都可以做

  • 函数和方法对比

  • C语言定义函数格式
  • 返回值类型 函数名称(形参列表) {
            函数体相关语句;
            return 返回值;
    }
  • Go语言定义函数格式
  • func  函数名称(形参列表)(返回值列表) {
            函数体相关语句;
            return 返回值;
    }
  • C语言中没有方法的概念, 但是Go语言中有方法
    • 对于初学者而言,可以简单的把方法理解为一种特殊的函数
func  (接收者 接受者类型)函数名称(形参列表)(返回值列表) {
        函数体相关语句;
        return 返回值;
}

Go语言程序主函数定义格式

  • Go语言main函数格式
    • func 告诉系统这是一个函数
    • main主函数固定名称
    • 函数左括号必须和函数名在同一行
    • main函数必须在main包中
// 告诉系统当前编写的代码属于哪个包
package main
// 定义了一个名称叫做main的函数
func main() {
}

C语言关键字和Go语言关键字对比

內建函数
makelencapnew
appendcopydeletereal
imagpanicrecovercomplex

标识符

  • Go语言的命名规范和C语言一样, 都是采用驼峰命名, 避免采用_命名
    • _命名: send_message / say_hello
    • 驼峰命名: sendMessage / sayHello
import (
	"fmt"
	"unsafe"
)

func main() {
	fmt.Println("int size = ", unsafe.Sizeof(int(0)))
	fmt.Println("int8 size = ", unsafe.Sizeof(int8(0)))
	fmt.Println("int16 size = ", unsafe.Sizeof(int16(0)))
	fmt.Println("int32 size = ", unsafe.Sizeof(int32(0)))
	fmt.Println("int64 size = ", unsafe.Sizeof(int64(0)))
	fmt.Println("uint size = ", unsafe.Sizeof(uint(0)))
	fmt.Println("uint8 size = ", unsafe.Sizeof(uint8(0)))
	fmt.Println("uint16 size = ", unsafe.Sizeof(uint16(0)))
	fmt.Println("uint32 size = ", unsafe.Sizeof(uint32(0)))
	fmt.Println("uint64 size = ", unsafe.Sizeof(uint64(0)))
	fmt.Println("uintptr size = ", unsafe.Sizeof(uintptr(0)))
	fmt.Println("byte size = ", unsafe.Sizeof(byte(0)))
	fmt.Println("rune size = ", unsafe.Sizeof(rune(0)))
	fmt.Println("float32 size = ", unsafe.Sizeof(float32(0)))
	fmt.Println("float64 size = ", unsafe.Sizeof(float64(0)))
	fmt.Println("true size = ", unsafe.Sizeof(true))
	fmt.Println("false size = ", unsafe.Sizeof(false))

}
  • Go语言中定义变量有三种格式
// 标准格式
var 变量名称 数据类型 = 值;
// 自动推到类型格式
var 变量名称 = 值;
// 简短格式(golang官方推荐格式)
变量名称 := 值;
  • 一定不要把:=当做赋值运算符来使用
  • :=只能用于定义局部变量,不能用于定义全局变量
  • 变量组中不能够使用:=
  • 通过:=同时定义多个变量, 必须给所有变量初始化
  • 通过:=同时定义多个变量, 只要任意一个变量没有定义过,都会做退化赋值操作
package main
import "fmt"
func main() {
	// 定义一个变量num1
	num1 := 10
	// 同时定义两个变量num1和num2, 由于num2从来没有定义过,
	// 所以对于num1来说:=退化为赋值运算符, 而对于num2来说:=仍然是定义+赋值
	num1, num2 := 20, 30
	fmt.Println("num1 = ", num1)
	fmt.Println("num2 = ", num2)
}

局部变量和全局变量

  • Go语言中局部变量的概念以及全局变量的概念和C语言一模一样

  • 局部变量:

    • 定义在函数内部的变量以及函数的形参称为局部变量
    • 作用域:从定义哪一行开始直到与其所在的代码块结束
    • 生命周期:从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域
  • 全局变量:

    • 定义在函数外面的变量称为全局变量
    • 作用域范围:从定义哪行开始直到文件结尾
    • 生命周期:程序一启动就会分配存储空间,直到程序结束
  • Go语言中无论是全局变量还是局部变量,只要定义了一个变量都有默认的0值
    • int/int8/int16/int32/int64/uint/uint8/uint16/uint32/uint64/byte/rune/uintptr的默认值是0
    • float32/float64的默认值是0.0
    • bool的默认值是false
    • string的默认值是""
    • pointer/function/interface/slice/channel/map/error的默认值是nil
    • 其它复合类型array/struct默认值是内部数据类型的默认值
        var num0 int = 10
  	var num2 int16
  	//num2 = num0 // 编译报错, 不同长度的int之间也需要显示转换
  	num2 = int16(num0)

数值类型和字符串类型之间转换

  • 数值类型转字符串类型strconv..FormatXxx()
package main
  import "fmt"
  func main() {
  	var num1 int32 = 10
  	// 第一个参数: 需要被转换的整型,必须是int64类型
  	// 第二个参数: 转换为几进制,  必须在2到36之间
  	// 将32位十进制整型变量10转换为字符串,并继续保留10进制格式
  	str1 := strconv.FormatInt(int64(num1), 10)
  	fmt.Println(str1) // 10
  	// 将32位十进制整型变量10转换为字符串,并转换为2进制格式
  	str2 := strconv.FormatInt(int64(num1), 2)
  	fmt.Println(str2) // 1010
  	var num5 float64 = 3.1234567890123456789
  	// 第一个参数: 需要转换的实型, 必须是float64类型
  	// 第二个参数: 转换为什么格式,f小数格式, e指数格式
  	// 第三个参数: 转换之后保留多少位小数, 传入-1按照指定类型有效位保留
  	// 第四个参数: 被转换数据的实际位数,float32就传32, float64就传64
  	// 将float64位实型,按照小数格式并保留默认有效位转换为字符串
  	str3 := strconv.FormatFloat(num5, 'f', -1, 64)
  	fmt.Println(str3) // 3.1234567
  	str4 := strconv.FormatFloat(num5, 'f', -1, 64)
  	fmt.Println(str4) // 3.1234567890123457
  	// 将float64位实型,按照小数格式并保留2位有效位转换为字符串
  	str5 := strconv.FormatFloat(num5, 'f', 2, 64)
  	fmt.Println(str5) // 3.12
  	// 将float64位实型,按照指数格式并保留2位有效位转换为字符串
  	str6 := strconv.FormatFloat(num5, 'e', 2, 64)
  	fmt.Println(str6) // 3.12
  • 字符串类型转数值类型strconv.ParseXxx()
var str1 string = "125"
  	// 第一个参数: 需要转换的数据
  	// 第二个参数: 转换为几进制
  	// 第三个参数: 转换为多少位整型
  	// 注意点: ParseInt函数会返回两个值, 一个是转换后的结果, 一个是错误
  	// 如果被转换的数据转换之后没有超出指定的范围或者不能被转换时,
  	// 那么错误为nil, 否则错误不为nil
  	// 将字符串"125"转换为10进制的int8
  	num1, err := strconv.ParseInt(str1, 10, 8)

  • 字符串类型和整型快速转换
  • func main() {
       	var num1 int32 = 110
       	// 快速将整型转换为字符串类型
       	// 注意:Itoa方法只能接受int类型
       	var str1 string = strconv.Itoa(int(num1))
  func main() {
  	var num1 int32 = 110
  	// Sprintf函数和Printf函数很像, 只不过不是输出而将格式化的字符串返回给我们
  	var str1 string = fmt.Sprintf("%d", num1)
  • Go语言自定义常量: const 常量名称 数据类型 = 值or const 常量名称 = 值
const num1, num2 int  = 100, 200
  • Go语言实现枚举格式
const(
  枚举元素1 = iota
  枚举元素2 = iota
  ... ...
)
  • 利用iota标识符标识符实现从0开始递增的枚举
    package main
    import "fmt"
    func main() {
    	const (
    		male = iota
    		female = iota
    		yao = iota
    	)
Go语言基础 (一)初识Golang 文章目录发展历程语言特点适用人群我为什么学习Golang注意事项系列文章分类参考链接 发展历程 Go语言是在2007年由Robert Griesemer、Ken Thompson、Rob Pike三位大牛在Google合作开发的一门编程语言。 作为惯例,先来看看这三位大牛的发量如何[doge]。 其实,仔细一看还是挺多的… 言归正传,到2009年的时候,Go语言的第一个正式版本以开源的形式发布。直到现在,经过10多年的发展,Go的最新版本1.18.2已经发布。并且,生态也越来越成熟,使用Go语言进行业务开 阅读详情

相关推荐

Golang使用go mod 导入本地库

Goland使用go mod 导入本地库 主要分为两种情况:一种是在同一个项目下导入,一种是两个不同项目 我的gopath路径在D:gowork 同一个项目导入 这种情况是不需要改动go.mod文件文件结构如下,firsttest目录下一个main.go文件,外加当前文件夹下面的InvokeDir文件夹,文件下面有个invoke.go文件,作为测试用的调用函数 1.go.mod文件,注意module名字为firsttest,这个名字就是module名字 main.go文件内容,可以看到直接用mod

hungrylion的博客 8151

yao:Yao 是 Golang 的 ORM

#YAO ###又一个奥姆 Yao 是 Golang 的 ORM,灵感来自目前只兼容 postgresql。 用法 生成结构 go get github.com/alfonsodev/yao yao gen -ddbname -o$(pwd)/models 导入并连接 mysql: import "github.com/youpackage/models/tablename" PostgreSQL: import "github.com/youpackage/models/schemaname/tablename" 保存 var user Users user . Email . Scan ( "yao@yao-orm.org" ) user . Save () 从用户表中选择所有用户 users , err := Users . Al

从零开发一个定制版音乐播放器,女朋友不就有了吗?

极客江南: 一个对开发技术特别执着的程序员,对移动开发有着独到的见解和深入的研究,有着多年的iOS、Android、HTML5开发经验,对NativeApp、HybridApp、WebApp开发有着独到的见解和深入的研究, 除此之外还精通 JavaScript、AngularJS、 NodeJS 、Ajax、jQuery、Cordova、React Native等多种Web前端技术及Java、PHP等服务端技术。 上一文章,利用 3 分钟做了一个 冰冰版 3D 音乐播放器,今天再带着大家利用 1 小时.

李南江 9333

Go语言常量和变量

Go语言数据类型 Go语言本质是用C语言编写的一套高级开发语言, 所以Go语言中的数据类型大部分都是由C语言演变而来的 C语言数据类型 Go语言数据类型 C语言各数据类型占用内存空间 类型 32位编译器 64位编译器 char 1 1 int 4 4 float 4 4 double 8 8 short 2 2 long 4 8 long long 8 8 void* 4 8 Go语言各数据类型占用内存空间 类型 32位编

李南江 734

5万字 TypeScript入门系列(第四期)(建议收藏)

极客江南: 一个对开发技术特别执着的程序员,对移动开发有着独到的见解和深入的研究,有着多年的iOS、Android、HTML5开发经验,对NativeApp、HybridApp、WebApp开发有着独到的见解和深入的研究, 除此之外还精通 JavaScript、AngularJS、 NodeJS 、Ajax、jQuery、Cordova、React Native等多种Web前端技术及Java、PHP等服务端技术。 初学者玩转 TypeScript系列,总计 5 期,本文为第 4 期,点赞、收藏、评论、关.

李南江 1318

【CGOgo编译生成.so文件.h文件

go编译生成.so文件.h文件

qq_40119224的博客 1330

csdn极客江南

零基础学会 C 语言课程学习突破 1500 人: 学习地址:https://edu.csdn.net/course/detail/31452?spm=1001.2014.3001.5507TS TS 专栏文章更新至第8期: 学习地址:https://blog.csdn.net/weixin_44617968/article/details/119853157?spm=1001.2014.3001.5501 C语言专栏:https://blog.csdn.net/weixin_44617968/catego.

编程一时爽爽一时 903

Golang语言基础008_接口详解

接口(Interface)是Go语言中实现抽象和多态的核心机制,它定义了一组方法签名但不包含具体实现。通过接口,我们可以编写更加灵活和可扩展的代码,实现面向接口编程的设计原则。 Go语言的接口设计独特,采用隐式实现的方式,类型只要实现了接口定义的所有方法就自动被认为实现了该接口,这种设计使得接口的使用更加灵活和简洁。本文将深入介绍接口的概念、声明方式、实现方法以及最佳实践,帮助读者掌握Go语言中这一重要特性。

ChineHe的博客 1209

Golang教程第3语言基础语法)

单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。上一章节我们已经了解了 Go 语言的基本组成结构,本章节我们将学习 Go 语言的基础语法。在 Go 语言中,空格通常用于分隔标识符、关键字、运算符和表达式,以提高代码的可读性。在函数调用时,函数名和左边等号之间要使用空格,参数之间也要使用空格。程序一般由关键字、常量、变量、运算符、类型和函数组成。

bianenhui91的专栏 893

go语言基础1

package main import ( "fmt" ) func main() { fmt.Println("Hello World") fmt.Println(getStr()) getLength() fmt.Println() values := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} resultChan := make(ch...

niqinge 370

go 打印bool_Golang语言基础教程:键盘输入和打印输出

一、打印输出1.1 fmt包fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb('verb')源自C语言但更简单。详见官网fmt的API:https://golang.google.cn/pkg/fmt/1.2 导入包import "fmt" 1.3 常用打印函数打印:func Print(a ...interface{}) (n int, err error)格式化打...

weixin_36266554的博客 4663

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

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

杨秀璋的专栏 12万+

GO:手握Java走进Golang的世界

Go简介、Go和Java的对比

健身变秃,coding变强 1万+

GoGolang 有什么关系?

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

EDDYCJY的博客 1万+

经过几天的努力,出了 2 本保姆级编程电子书!

最近码了几十万字,大家可以在我的主页查看,不过得到了很多读者的认可,短短 2 周时间,获得 1300 多点赞,接近 7000 次收藏,5500 多粉丝,再次感谢各位的认可。 鉴于很多小伙伴的学习,想要对应的电子书,方便打印于学习,最近在忙碌之中为大家整理好了电子书,总共 2 本。 一本是 C 语言保姆级教程 2021 版 一本 Go 语言保姆级教程 2021 版 排版这 2 本电子书话费了不少时间,这 2 本书合计有二十万字左右,四百页。 下面是电子书对应的效果,希望能帮助大家。 如果觉得有.

李南江 1471

go生成动态库,给c调用

1.go源码 package main import "C" //export Hello func Hello() string { return "Hello" } func main() { } } 2.go生成动态库 gobuild -v -x -buildmode=c-shared -o libhello.so 会生成libhello.h、libhello.so两个文件。 #include<stdio.h> #include "libhello.h" void

Fengfgg的博客 846

goland编译启用go modules的go项目找不到cgo依赖的.c或者.h文件问题解决一例

开发工具goland,golang版本1.13,项目里面用到了cgo,具体点用的操作oracle的godror,这个组件库是c语言的写的,编译程序时需要用到一系列的.c和.h文件去完成编译过程。 项目里面启动了go modules,go mod vendor以后在开发工具里面是看不到有任何的.c或者.h文件的,如下: 只有.go文件和一些其他的文件,没有odpi要用到的.c和.h文件,编译...

程序员记事本 8098
上一篇: MongoDB docker 方式启动
wellsmith
博客等级 码龄22年 15粉丝 26原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值