Go基础(包、变量和函数):开启Go语言之旅

2023-11-17

开启Go语言之旅

Go编程语言是一个开源项目,可以让程序员提高工作效率。

Go是富有表现力,简洁,干净和高效的。其并发机制使编写充分利用多核和联网机器的程序变得容易,而其新颖类型系统则可实现灵活的模块化程序构建。快速编译为机器代码,但具有垃圾收集的便利性和运行时反射的能力。它是一种快速,静态类型的编译语言,感觉像是一种动态类型的解释型语言。


一、包

Go语言也是要从包开始学起来

package main

//使用import导包
import (
    _ "fmt"
    "fmt"
    "math/rand"
    "math"
)

func main()  {
    fmt.Println("你好,世界")
    fmt.Println("my faovrite number is", rand.Intn(100))
    fmt.Println(math.Pi)
}

二、函数

  • 函数的一些例子
package main

import (
    _ "fmt"
    "fmt"
)

/**
 *函数可以没有参数或接受多个参数。
 *在本例中,add 接受两个 int 类型的参数。
 *注意类型在变量名 之后。
 *计算x+y,返回一个int类型的值
 */
func add(x int, y int)  int{
    return x + y
}

/**
 * 当连续的两个或者多个函数的已命名形参类型相同时,除最后的一个类型外,其他的都可以省略掉
 *
 */
func add2(x, y int)  int{
    return x + y
}

/**
 * 多值返回
 * 函数可以返回多个任意数量的返回值
 * 将x、y交换位置
 */
func swap(x,y string)  (string, string){
    return y, x
}

/*命名返回值
 *Go 的返回值可被命名,它们会被视作定义在函数顶部的变量。
 *返回值的名称应当具有一定的意义,它可以作为文档使用。
 *没有参数的 return 语句返回已命名的返回值。也就是 直接 返回。
 *直接返回语句应当仅用在下面这样的短函数中。在长的函数中它们会影响代码的可读性。
 *传入一个int类型的sum,计算后返回一个int类型x和一个int类型的y
 */
func split(sum int)(x, y int)  {
    x = sum * 4 / 9
    y = sum - x
    return
}

func main()  {
    fmt.Println(add(42,31))
    fmt.Println(add2(42,31))

    a, b := swap("hello", "world")
    fmt.Println(a, b)

    fmt.Println(split(17))
}
  • 输出结果
73
73
world hello
7 10

三、变量

变量这个和Java的变量没有多大的差别。

package main

import (
    _ "fmt"
    "fmt"
)
/**
 * 变量
 * var 语句用于声明一个变量列表,跟函数的参数列表一样,类型在最后。
 * 定义了几个变量
 * 它们的类型为boolean类型的
 * 默认初始化值为false
 */
var c, python, java bool

//--------------------------------------------------------
 /**
  * 变量的初始化
  * 变量声明可以包含初始值,每个变量对应一个
  * 如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型
  */
var g, j int  = 1, 2

//-------------------------------------------------------
/**
 * 短变量声明
 * 在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。
 * 函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用。
 */
 //:=不能在函数外使用
 //k := 4

func main()  {
    //变量
    // int类型的i,默认值为0
    var i int
    fmt.Println(i, c, python, java)

    //变量的初始化
    // --------------------------------------------------
    var d, e, f = true, false, "helloworld"
    fmt.Println(g, j, d, e, f)

    //短变量声明
    // --------------------------------------------------
    var h, k int = 1, 2
    //声明一个短变量
    p := 3
    l, m, n := true,false,"no!"
    fmt.Println(h,k,p,l,m,n)

}
  • 输出结果:
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/wangdong/go #gosetup
/usr/local/go/bin/go build -i -o /private/var/folders/w4/3z7svk7s6n7c85w6t6j7t4_80000gn/T/___go_build_variables_go /Users/wangdong/Block/go/godemo01/src/main/variables.go #gosetup
/private/var/folders/w4/3z7svk7s6n7c85w6t6j7t4_80000gn/T/___go_build_variables_go #gosetup
0 false false false
1 2 true false helloworld
1 2 3 true false no!

Process finished with exit code 0

四、Go的基本类型

Go的基本类型就比较特殊了,和Go相比还是有蛮大的差距的。

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // uint8 的别名

rune // int32 的别名
    // 表示一个 Unicode 码点

float32 float64

complex64 complex128
  • int, uint 和 uintptr 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽。 当你需要一个整数值时应使用 int 类型,除非你有特殊的理由使用固定大小或无符号的整数类型。
  • 下面看一个例子:
package main

import (
    _ "fmt"
    "fmt"
)
/**
 * 变量
 * var 语句用于声明一个变量列表,跟函数的参数列表一样,类型在最后。
 * 定义了几个变量
 * 它们的类型为boolean类型的
 * 默认初始化值为false
 */
var c, python, java bool

//--------------------------------------------------------
 /**
  * 变量的初始化
  * 变量声明可以包含初始值,每个变量对应一个
  * 如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型
  */
var g, j int  = 1, 2

//-------------------------------------------------------
/**
 * 短变量声明
 * 在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。
 * 函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用。
 */
 //:=不能在函数外使用
 //k := 4

func main()  {
    //变量
    // int类型的i,默认值为0
    var i int
    fmt.Println(i, c, python, java)

    //变量的初始化
    // --------------------------------------------------
    var d, e, f = true, false, "helloworld"
    fmt.Println(g, j, d, e, f)

    //短变量声明
    // --------------------------------------------------
    var h, k int = 1, 2
    //声明一个短变量
    p := 3
    l, m, n := true,false,"no!"
    fmt.Println(h,k,p,l,m,n)

}
  • 输出结果:
Type: bool Value: false
Type: uint64 Value: 18446744073709551615
Type: complex128 Value: (2+3i)

五、零值

没有明确初始值的变量声明会被赋予它们的 零值。
零值是:

  • 数值类型为 0,
  • 布尔类型为 false,
  • 字符串为 “”(空字符串)。
  • 下面看一个例子
package main

import (
    _ "fmt"
    "fmt"
)

func main()  {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
}
  • 输出结果:
0 0 false ""

六、类型转换

表达式 T(v) 将值 v 转换为类型 T。

一些关于数值的转换:

var i int = 42
var f float64 = float64(i)
var u uint = uint(f)

或者,更加简单的形式:

i := 42
f := float64(i)
u := uint(f)

与 C 不同的是,Go 在不同类型的项之间赋值时需要显式转换。试着移除例子中 float64 或 uint 的转换看看会发生什么。

下面来看一个例子:

package main

import (
    "math"
    "fmt"
)

func main()  {
    var x, y int  = 3, 4
    var f float64  = math.Sqrt(float64(x*x + y*y))
    var z uint  = uint(f)
    fmt.Println(x, y ,z)
}

输出结果:

3 4 5

七、类型推导

在声明一个变量而不指定其类型时(即使用不带类型的 := 语法或 var = 表达式语法),变量的类型由右值推导得出

当右值声明了类型时,新变量的类型与其相同:

var i int
j := i // j 也是一个 int

不过当右边包含未指明类型的数值常量时,新变量的类型就可能是 int, float64 或 complex128 了,这取决于常量的精度:

i := 42           // int
f := 3.142        // float64
g := 0.867 + 0.5i // complex128

尝试修改示例代码中 v 的初始值,并观察它是如何影响类型的。
- 下面写一个例子:

package main

import (
    "fmt"
)

func main()  {
    v := 42 // 修改这里!
    v2 := 42.4323 // 修改这里!
    v3 := 42.323423423 + 34234i // 修改这里!
    v4 := 42.00 // 修改这里!
    v5 := 0.42434342342 // 修改这里!
    v6 := 4000.42 // 修改这里!
    fmt.Printf("v is of type %T\n", v)
    fmt.Printf("v is of type %T\n", v2)
    fmt.Printf("v is of type %T\n", v3)
    fmt.Printf("v is of type %T\n", v4)
    fmt.Printf("v is of type %T\n", v5)
    fmt.Printf("v is of type %T\n", v6)
}
  • 输出的结果是:
v is of type int
v is of type float64
v is of type complex128
v is of type float64
v is of type float64
v is of type float64

八、常量

常量的声明与变量类似,只不过是使用 const 关键字。
常量可以是字符、字符串、布尔值或数值。
常量不能用 := 语法声明。

package main

import (
    _ "fmt"
    "fmt"
)

/**
 * 声明变量
 * 变量一般首字母小写
 * 常量一般首字母大写
 * 不光Pi和Truth是定义的常量
 * Hello、Happy、Go rules是常量
 */
const Pi  = 3.14

func main() {
    const World  = "世界"
    fmt.Println("Hello",World)
    fmt.Println("Happy", Pi, "Day")

    const Truth  = true;
    fmt.Println("Go rules?", Truth)
}

九、数值常量

数值常量是高精度的 值。
一个未指定类型的常量由上下文来决定其类型。
再尝试一下输出 needInt(Big) 吧。

(int 类型最大可以存储一个 64 位的整数,有时会更小。)
(int 可以存放最大64位的整数,根据平台不同有时会更少。)

  • 下面看一个例子
package main

import "fmt"

const (
    // Create a huge number by shifting a 1 bit left 100 places.
    // In other words, the binary number that is 1 followed by 100 zeroes.
    //定义一个数值常量,前面一个1后面跟着100个0
    Big = 1 << 100
    // Shift it right again 99 places, so we end up with 1<<1, or 2.
    //将
    Small = Big >> 99
)

func needInt(x int) int  {
    return x * 10 + 1
}

func needFloat(x float64) float64 {
    return x * 0.1
}

func main() {
    fmt.Println(needInt(Small))
    fmt.Println(needFloat(Small))
    fmt.Println(needFloat(Big))
    fmt.Println(Small)
    fmt.Println(Big*0.1)
}
  • 输出结果
21
0.2
//表示1.2676506002282295 * (10)^ 29次方
1.2676506002282295e+29
2
1.2676506002282295e+29

好啦,基础知识已经学习完了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go基础(包、变量和函数):开启Go语言之旅 的相关文章

  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • 按顺序范围循环映射

    我正在寻找一种确定的方法来范围Go map为了 Go 规范 https golang org ref spec For statements陈述如下 映射的迭代顺序未指定 并且不保证从一次迭代到下一次迭代的顺序相同 如果在迭代过程中删除尚未
  • 如何更改“go build”的库路径

    我正在尝试与 goncurses 一起工作 在 Centos 6 上 ncurses 库很旧 5 7 想要 5 9 所以我从源代码构建了 ncurses 并将其安装到 usr lib usr include 等中 如何告诉 go get 针
  • 空或不需要的结构字段

    我有两个结构体 代表将插入到 mongodb 数据库中的模型 一个结构 投资 将另一个结构 集团 作为其字段之一 type Group struct Base Name string json name bson name type Inv
  • go:找到模块但不包含包

    我正在尝试安装 go 的网络包 但收到 不包含包错误 终端截图 我咨询过 go 模块 latest 已找到但不包含包 https stackoverflow com questions 62974985 go module latest f
  • 读取一个文本文件,替换其中的单词,输出到另一个文本文件

    所以我试图在 GO 中编写一个程序来获取一个充满代码的文本文件并将其转换为 GO 代码 然后将该文件保存到 GO 文件或文本文件中 我一直在试图弄清楚如何保存对文本文件所做的更改 但我可以看到更改的唯一方法是通过 println 语句 因为
  • Go中funcappend的实现在哪里?

    我对 go 非常感兴趣 并尝试阅读 go 函数的实现 我发现其中一些函数没有实现 如追加或调用 The append built in function appends elements to the end of a slice If i
  • 通过 API Gateway 使用表单数据将图像发布到 Lambda 函数会导致文件无效

    I ve a 用 Go 编写的 Lambda 函数 https github com mhausenblas imgn blob master functions app uploadimg main go应该允许图像文件上传 通过 HTM
  • 如何通过模板中的变量访问对象字段?

    我有一个嵌套循环 columns columns range dx dataList range c columns index dx c end end dataList是orm模型数组 和ID Title字段 那么columns is
  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i
  • Google Cloud Kubernetes 上任务队列的替代方案

    我发现任务队列主要用于App Engine标准环境 我正在将现有服务从 App Engine 迁移到 Kubernetes 任务队列的一个好的替代方案是什么 推送队列是当前正在使用的队列 我在线阅读文档并浏览了此链接 何时使用 PubSub
  • 使用cgo时的多重定义

    package main int add int a int b return a b import C import fmt func main func Test1 fmt Println C add 1 3 export Test2
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 如何在特定文件夹中运行 shell 命令

    我可以用这个out err exec Command git log Output 获取将在与可执行位置相同的路径中运行的命令的输出 如何指定要在哪个文件夹中运行命令 exec Command https golang org pkg os

随机推荐

  • 【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

    文章目录 总结 01 递归删除结点 02 删除结点 03 反向输出 04 删除最小值 05 逆置 06 链表递增排序 07 删除区间值 08 找公共结点 09 增序输出链表 10 拆分链表 尾插 11 拆分链表 头插 12 删除相同元素 1
  • Python 生成随机的六位数

    首先给出代码 然后再分析代码中函数的意思 1 生成随机的六位数 import random str for i in range 6 ch chr random randrange ord 0 ord 9 1 str ch print st
  • 深度包检测(DPI)的记录

    20210301 0 引言 大概一年半之前 让学生整理过关于DPI的内容 当时让他部署过nDPI的DPDK版本 当时给我的DPI的材料也没仔细看 这里直接贴到这里来 材料中的内容应该也是从别的地方复制粘贴的 基本上就是一些显而易见的材料 1
  • LLVM编译

    欢迎到我的博客来阅读这篇文章 https qiu weidong github io 2022 05 01 llvm build Windows下编译LLVM 安装Visual Studio 首先需要下载Visual Studio Inst
  • JAVA与C++的区别详解

    转自 微点阅读 https www weidianyuedu com JAVA和C 都是面向对象语言 也就是说 它都能够实现面向对象思想 封装 继乘 多态 而由于c 为了照顾大量的C语言使用者 而兼容了C 使得自身仅仅成为了带类的C语言 多
  • 火山翻译亮相飞书未来无限大会,打造全新翻译体验

    5月19日下午 2021春季飞书未来无限大会在北京召开 火山翻译携带火山同传 VolctransGlass AR智能翻译眼镜现身大会展厅 让观众了解前沿翻译技术和方案 并体验机器翻译如何在日常生活 工作和重要会议上帮助人们实现无障碍交流 本
  • 2019.9.27 csp-s模拟测试53 反思总结

    这个起名方式居然还有后续 为什么起名不是连续的 T1想了半天 搞出来了 结果数组开小 其实是没注意范围 T2概率期望直接跳 后来翻回来写发现自己整个理解错了期望的含义 何 T3错误想到赛道修建结果来了个错误贪心 关于T2破罐子破摔输出k居然
  • SPSS知识点复习

    一 T检验 对连续变量使用的方法 T检验 方差检验 1 均值 Means 过程 完成数据分组输出描述统计量 2 T检验 用t分布理论来推论差异发生的概率 从而比较两个平均数的差异是否显著 前提 总体服从正态分布 样本量不超过30 3 单样本
  • [Bug集合]terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

    terminate called after throwing an instance of std bad alloc what std bad alloc 超内存了兄dei 我出现这个问题是因为读入了大量图片 结果系统提示这个信息
  • 解决flex布局中 space-between方法的排版问题

    flex布局中 justify content space between方法的排版问题 flex给我们的布局带来了很大的方便 但有时候也会碰到一些问题 比如space between最后一行元素的排列问题 问题 假如我们有8个元素 ul
  • Lethean结点搭建

    文章目录 结点搭建 日志位置 钱包地址 Lethean官网 https github com LetheanMovement lethean github地址 https github com LetheanMovement lethean
  • 华为OD机试真题-热点网站统计-2023年OD统一考试(B卷)

    题目描述 企业路由器的统计页面 有一个功能需要动态统计公司访问最多的网页URL top N 请设计一个算法 可以高效动态统计Top N的页面 输入描述 每一行都是一个URL或一个数字 如果是URL 代表一段时间内的网页访问 如果是一个数字N
  • String.format()方法使用详解技巧

    一 时间切割 String year String format tY 2020 04 30 2020 String month String format tm 2020 04 30 04 String day String format
  • [454]bokeh之bokeh.layouts

    如果希望在同一张图上显示多个图像 可以使用bokeh layouts类中的方法 row column gridplot widgetbox layout row row 的作用是将多个图像以行的方式放到同一张图中 from bokeh io
  • 出现Command ‘locate‘ not found,but can be installed with:apt install mlocate解决方法

    出现Command locate not found but can be installed with apt install mlocate解决方法 在使用Ubuntn出现Command locate not found but can
  • 以太坊区块链浏览器搭建

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 当然 读者若要实践 那么电脑上必须已经搭建好了geth 并且命令 geth version 能显示版本信息 针对以太坊各个链 私链 公链 测试链 都可以用该篇文章来
  • Keil MDK误将Project窗口关了的解决办法,窗口视图重置

    在使用MDK时 误将Project窗口或者其他窗口关了 点击view 选择对应的窗口即可 或者点击Window窗口 选择Reset View to Defaults 再点击Reset即可实现窗口的重置
  • 项目管理:要做一项任务,不要做一堆事儿

    作为项目经理 我们最终的任务和目标是把项目高标准的完成 在完成最终目标的过程中离不开项目成员的协作配合和任务工作的分配 只有项目组成员各司其职 高效的完成各自的工作 才能保证项目的效率和质量 那么如何保证项目组成员在完成各自任务的时候既能保
  • 打包vue前端docker镜像

    1 安装好docker环境 docker v 查看是否成功 2编写Dockerfile文件 下面这个dokcerfile的RUN指令不好 当有多个命令需要执行的时候 可以用换行符和连接符隔开 而不是写多个RUN指令 因为那样会增加镜像的构建
  • Go基础(包、变量和函数):开启Go语言之旅

    开启Go语言之旅 Go编程语言是一个开源项目 可以让程序员提高工作效率 Go是富有表现力 简洁 干净和高效的 其并发机制使编写充分利用多核和联网机器的程序变得容易 而其新颖类型系统则可实现灵活的模块化程序构建 快速编译为机器代码 但具有垃圾