Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go语言入门基础

Go语言入门基础

作者头像
李海彬
发布于 2018-03-27 04:04:46
发布于 2018-03-27 04:04:46
68300
代码可运行
举报
文章被收录于专栏:Golang语言社区Golang语言社区
运行总次数:0
代码可运行

指针

Go 具有指针。 指针保存了变量的内存地址。

类型 *T 是指向类型 T的值的指针。其零值是 nil 。

  1. var p *int

复制代码

& 符号会生成一个指向其作用对象的指针。

  1. i := 42
  2. p = &i

复制代码

*符号表示指针指向的底层的值。

  1. fmt.Println(*p) // 通过指针 p 读取 i
  2. *p = 21         // 通过指针 p 设置 i

这也就是通常所说的“间接引用”或“非直接引用”。

与 C 不同,Go 没有指针运算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

    i, j := 42, 2701

    p := &i         // point to i

    fmt.Println(*p) // read i through the pointer

    *p = 21         // set i through the pointer

    fmt.Println(i)  // see the new value of i

    p = &j         // point to j

    *p = *p / 37   // divide j through the pointer

    fmt.Println(j) // see the new value of j

}

结构体

一个结构体( struct )就是一个字段的集合。(而 type 的含义跟其字面意思相符。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type Vertex struct {

    X int

    Y int

}

func main() {

    fmt.Println(Vertex{1, 2})

}

结构体字段

结构体字段使用点号来访问。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type Vertex struct {

    X int

    Y int

}

func main() {

    v := Vertex{1, 2}

    v.X = 4

    fmt.Println(v.X)

}

结构体指针

结构体字段可以通过结构体指针来访问。 通过指针间接的访问是透明的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type Vertex struct {

    X int

    Y int

}

func main() {

    v := Vertex{1, 2}

    p := &v

    p.X = 1e9

    fmt.Println(v)

}

结构体符文

结构体符文表示通过结构体字段的值作为列表来新分配一个结构体。 使用 Name: 语法可以仅列出部分字段。(字段名的顺序无关。) 特殊的前缀 & 返回一个指向结构体的指针。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type Vertex struct {

    X, Y int

}

var (

    v1 = Vertex{1, 2}  // 类型为 Vertex

    v2 = Vertex{X: 1}  // Y:0 被省略

    v3 = Vertex{}      // X:0 和 Y:0

    p  = &Vertex{1, 2} // 类型为 *Vertex

)

func main() {

    fmt.Println(v1, p, v2, v3)

}

数组

类型 [n]T 是一个有 n 个类型为 T 的值的数组。

表达式

  1. var a [10]int

定义变量 a 是一个有十个整数的数组。

数组的长度是其类型的一部分,因此数组不能改变大小。这看起来是一个制约,但是请不要担心; Go 提供了更加便利的方式来使用数组。

切片(slice)

一个 slice 会指向一个序列的值,并且包含了长度信息。

[]T 是一个元素类型为 T 的 切片(slice)。

len(s)返回 slice s的长度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

    s := []int{2, 3, 5, 7, 11, 13}

    fmt.Println("s ==", s)

    for i := 0; i < len(s); i++ {

        fmt.Printf("s[%d] == %d\n", i, s[i])

    }

}

切片(slice)的切片

切片(slice)可以包含任意的类型,包括另一个 slice。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (

    "fmt"

    "strings"

)

func main() {

    // Create a tic-tac-toe board.

    game := [][]string{

        []string{"_", "_", "_"},

        []string{"_", "_", "_"},

        []string{"_", "_", "_"},

    }

    // The players take turns.

    game[0][0] = "X"

    game[2][2] = "O"

    game[2][0] = "X"

    game[1][0] = "O"

    game[0][2] = "X"

    printBoard(game)

}

func printBoard(s [][]string) {

    for i := 0; i < len(s); i++ {

        fmt.Printf("%s\n", strings.Join(s[i], " "))

    }

}

对 slice 切片

slice 可以重新切片,创建一个新的 slice 值指向相同的数组。

表达式

  1. s[lo:hi]

表示从 lo 到 hi-1 的 slice 元素,含前端,不包含后端。因此

  1. s[lo:lo]

是空的,而

  1. s[lo:lo+1]

复制代码

有一个元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

    s := []int{2, 3, 5, 7, 11, 13}

    fmt.Println("s ==", s)

    fmt.Println("s[1:4] ==", s[1:4])

    // 省略下标代表从 0 开始

    fmt.Println("s[:3] ==", s[:3])

    // 省略上标代表到 len(s) 结束

    fmt.Println("s[4:] ==", s[4:])

}

复制代码

构造 slice

slice 由函数 make 创建。这会分配一个全是零值的数组并且返回一个 slice 指向这个数组:

  1. a := make([]int, 5)  // len(a)=5

复制代码

为了指定容量,可传递第三个参数到 make:

  1. b := make([]int, 0, 5) // len(b)=0, cap(b)=5
  2. b = b[:cap(b)] // len(b)=5, cap(b)=5
  3. b = b[1:]      // len(b)=4, cap(b)=4

参考以下示例代码 -

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

    a := make([]int, 5)

    printSlice("a", a)

    b := make([]int, 0, 5)

    printSlice("b", b)

    c := b[:2]

    printSlice("c", c)

    d := c[2:5]

    printSlice("d", d)

}

func printSlice(s string, x []int) {

    fmt.Printf("%s len=%d cap=%d %v\n",

        s, len(x), cap(x), x)

}

nil slice

slice 的零值是 nil 。

一个 nil 的 slice 的长度和容量是 0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

    var z []int

    fmt.Println(z, len(z), cap(z))

    if z == nil {

        fmt.Println("nil!")

    }

}

向 slice 添加元素

向 slice 的末尾添加元素是一种常见的操作,因此 Go 提供了一个内建函数 append 。 内建函数的文档对 append 有详细介绍。

  1. func append(s []T, vs ...T) []T

append 的第一个参数 s 是一个元素类型为 T 的 slice ,其余类型为 T 的值将会附加到该 slice 的末尾。

append 的结果是一个包含原 slice 所有元素加上新添加的元素的 slice。

如果 s 的底层数组太小,而不能容纳所有值时,会分配一个更大的数组。 返回的 slice 会指向这个新分配的数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

    var a []int

    printSlice("a", a)

    // append works on nil slices.

    a = append(a, 0)

    printSlice("a", a)

    // the slice grows as needed.

    a = append(a, 1)

    printSlice("a", a)

    // we can add more than one element at a time.

    a = append(a, 2, 3, 4)

    printSlice("a", a)

}

func printSlice(s string, x []int) {

    fmt.Printf("%s len=%d cap=%d %v\n",

        s, len(x), cap(x), x)

}

复制代码

范围(range)

for 循环的 range 格式可以对 slice 或者 map 进行迭代循环。

当使用 for 循环遍历一个 slice 时,每次迭代 range 将返回两个值。 第一个是当前下标(序号),第二个是该下标所对应元素的一个拷贝。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ackage main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {

    for i, v := range pow {

        fmt.Printf("2**%d = %d\n", i, v)

    }

}

可以通过赋值给 _ 来忽略序号和值。

如果只需要索引值,去掉 “ , value ” 的部分即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {

    pow := make([]int, 10)

    for i := range pow {

        pow[i] = 1 << uint(i)

    }

    for _, value := range pow {

        fmt.Printf("%d\n", value)

    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语法指南
出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,它分为三节。第一节覆盖了基本语法及数据结构,第二节讨论了方法与接口, 第三节则简单介绍了 Go 的并发原语。每节末尾都有几个练习,你可以对自己的所学进行实践。 你可以 在线学习 或 安装到本地。 Go基础语法,方便查阅 包、变量和函数 学习 Go 程序的基本组件 1.包 每个 Go 程序都是由包组成的。 程序运行的入口是包 main。 这个程序使用并导入了包 "fmt" 和 "math/rand
spilledyear
2022/05/13
1.2K0
Go语法指南
GO语言基础知识
Go指针 指针变量 * 和地址值 & 的区别:指针变量保存的是一个地址值,会分配独立的内存来存储一个整型数字。当变量前面有 * 标识时,才等同于 & 的用法,否则会直接输出一个整型数字。
青梅煮码
2023/03/13
2800
厚土Go学习笔记 | 20. slice 继续
slice是一个序列的值,可以根据序列号来访问。可以使用 len(s) 返回 slice s 的长度。 写一个例子,利用 for 循环,打印出 slice 的每一个值。利用下标来访问每一个值。 package main import ( "fmt" ) func main() { s := []int{1,1,2,3,5,8,13,21,34} fmt.Println("slice s is", s) for i := 0; i < len(s); i++ {
李海彬
2018/03/28
6380
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
本文是《100天精通Golang(基础入门篇)——第11天:切片(Slice)》,将详细介绍切片的概念、语法、修改、以及len()、cap()、append()和copy()函数的使用。读者将通过学习本文深入了解Golang中切片的使用方法和常用函数的功能。
猫头虎
2024/04/08
2300
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
Go语言的容器 - Java技术债务
切片的零值是 nil 一个 nil 切片的长度和容量为 0,并且没有底层数组。切片可以包含任何类型,包括其他切片。
Java技术债务
2024/06/21
1820
Go——基础(2)
当用for循环遍历切片时,每次迭代都会返回两个值,第一个为当前元素下标,第二个为该下标所对应元素的一份副本
mumumu
2023/01/11
3100
第23节 切片(Slice)
Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大
小尘哥
2019/10/29
5530
Go两周入门系列-数组和切片(slice)
数组类型,是一组同类型数据的集合,通过从0开始的下标,访问元素值。数组初始化后长度是固定的,无法修改数组长度。
用户10002156
2023/09/27
1990
Go两周入门系列-数组和切片(slice)
Go - 快速入门
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
李郑
2019/12/12
8770
Golang之旅7-切片slice
切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。
皮大大
2021/03/02
2400
Go 语言切片(Slice)
Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 ---- 定义切片 你可以声明一个未指定大小的数组来定义切片: var identifier []type 切片不需要说明长度。 或使用make()函数来创建切片: var slice1 []type = make([]type, len) 也可以简写为 slice1 :=
李海彬
2018/03/22
6620
掌握一门语言Go
摘要:Go语言的优势不必多说,通过本篇文章,让我们花时间来掌握一门外语,Let's Go! 关键字:Go语言,闭包,基本语法,函数与方法,指针,slice,defer,channel,goroutine,select Go开发环境 针对Go语言,有众多老牌新厂的IDE。本地需要下载Go安装包,无论Windows还是Linux,安装差不多。这里推荐手动安装方式, 安装包下载地址:https://www.golangtc.com/download 解压缩存放相应位置(linux可选位置usr/loc
文彬
2018/05/03
1.2K0
java与Go的交流
channel 可以是 _带缓冲的_。为 make 提供第二个参数作为缓冲长度来初始化一个缓冲 channel: ch := make(chan int, 100) 向缓冲 channel 发送数据的时候,只有在缓冲区满的时候才会阻塞。当缓冲区清空的时候接受阻塞。 修改例子使得缓冲区被填满,然后看看会发生什么。 package main import "fmt" func main() { c := make(chan int, 2) c <- 1 c <- 2 fmt.Println(<-c) fmt.Println(<-c) }
三产
2021/01/13
5890
Google资深工程师深度讲解Go语言-内建容器(三)[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111729.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/12
2390
Google资深工程师深度讲解Go语言-内建容器(三)[通俗易懂]
Go语言笔记----基础语法
defer关键字的功能类似于c++的析构函数,用defer关键字声明的函数,会在当前方法执行结束后被执行,并且执行顺序类似于栈的先进后出关系
大忽悠爱学习
2022/05/10
5120
Go语言笔记----基础语法
go语言基础语法入门
首先字节跳动已经全面拥抱了 go 语言,公司内部有上万个微服务使用 golang 来编写,不久前也开源了 GORPC 框架 KiteX。腾讯、百度、美团、滴滴、深信服、平安、OPPO、知乎、去哪儿、360、金山、微博、bilibili、七牛、PingCAP 等公司也在大量使用 Go 语言。 国外 Google Facebook 等公司也在大量使用 Go 语言。 从业务维度看过语言已经在云计算、微服务、大数据、区块链、物联网等领域蓬勃发展。然后在云计算、微服务等领域已经有非常高的市场占有率 Docker、Kubernetes、Istio、etcd、prometheus 几乎所有的云原生组件全是用 Go 实现的。
timerring
2023/10/13
2530
Go语言基础速刷手册
这个“不务正业”的阿巩,今天冒着现学现卖的风险来和大家分享Go了,作为既具备C的理念又有Python 姿态的语言,怎么能不来试上一试呢!
才浅Coding攻略
2022/12/12
9460
GO语言基础之切片
1、切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。 2、切片的长度可以改变,因此,切片是一个可变的数组。 3、切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。 4、cap可以求出slice最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。 5、切片的定义:var 变量名 []类型,比如 var str []string var arr []int。 6、如果 slice == nil,那么 len、cap 结果都等于 0。
墨紫羽墨
2022/03/01
3300
Go语言入门——数组、切片和映射(下)
  不管是数组、切片还是映射结构,都是一种集合类型,要从这些集合取出元素就要查找或者遍历。
JackieZheng
2019/05/28
6510
Go语言——复合类型
二维数组表示一个数组变量中每个元素又是一个一维数组变量,跟java一样 声明二维数组:
传说之下的花儿
2023/04/16
4500
相关推荐
Go语法指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验