GoLang之语法糖讲解

article/2025/9/17 20:02:11

文章目录

  • GoLang之语法糖讲解
    • 1.变量声明
      • 1.1变量
      • 1.2 "var"声明(指定类型)
      • 1.3"var"声明(无指定类型)
      • 1.4 "name:= expression"声明
        • 1.4.1单声明
        • 1.4.2多变量声明中若其中一个变量是新的则可以使用两次
        • 1.4.3函数内与短语句块中声明相同的名称
      • 1.5 "name:= expression"声明注意事项
        • 1.5.1不能在函数外使用
        • 1.5.2不能在同一作用域使用相同的语句两次
      • 1.6多变量声明
    • 2.New函数
      • 2.1介绍
      • 2.2以创建int型为示例
    • 3. "..."
      • 3.1介绍
      • 3.2以fmt.Println为示例
      • 3.3 "..."可用于初始化数组
    • 4. for range
      • 4.1介绍
      • 4.2for range遍历切片/数组/字符串的三种方式
      • 4.3for range遍历map的三种方式
      • 4.4for range遍历channel的三种方式
    • 5.接收者方法
      • 5.1介绍
      • 5.2接收者为原类型时调用方法正常
      • 5.3接收者为指针类型时直接调用方法失败
      • 5.4接收者为指针类型时直接调用方法成功

GoLang之语法糖讲解

1.变量声明

1.1变量

变量可以通过变量名访问。
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
声明变量的一般形式是使用 var 关键字:

var identifier type

可以一次声明多个变量:

var identifier1, identifier2 type

优先局部变量

image-20220124165055767

for局部变量

image-20220124165150998

if局部变量

image-20220124165300416

1.2 "var"声明(指定类型)

指定变量类型,如果没有初始化,则变量默认为零值。
零值就是变量没有做初始化时系统默认设置的值。
数值类型(包括complex64/128)为 0
布尔类型为 false
字符串为 “”(空字符串)
以下几种类型为 nil:
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口

// 形式一
var x int
x = 1
// 形式二
var x int = 1
// 形式三
var x = 1

1.3"var"声明(无指定类型)

根据值自行判定变量类型。

var v_name = value
package main
import "fmt"
func main() {var d = truefmt.Println(d)//true
}

1.4 "name:= expression"声明

1.4.1单声明

x := 42

1.4.2多变量声明中若其中一个变量是新的则可以使用两次

在多变量声明中,如果其中一个变量是新的,可以使用 := 两次

x, y := 1, 2
y, z := 3, 4 // z 是新的变量
x, z := 5, 6 // 错误,x、z 均已定义过

1.4.3函数内与短语句块中声明相同的名称

可以在短语句块中声明相同的名称,例如:if、for、switch 中,但它们有各自作用域

func main() {x := 1if true {x := 2fmt.Printf("x = %d\n", x) // x = 2}fmt.Printf("x = %d\n", x) // x = 1
}

1.5 "name:= expression"声明注意事项

1.5.1不能在函数外使用

不能在函数外使用 := ,因为在任何函数外,语句都应该以关键字开头,例如 type、var这样的关键字

// 不合法
x := 42
// 合法
var y = 42func main() {// 合法z:= 42
}

1.5.2不能在同一作用域使用相同的语句两次

:= 代表引入一个新的变量,所以不能在同一作用域使用相同的 := 语句两次

x := 1
x := 1 // 重复定义,错误

1.6多变量声明

//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误// 这种因式分解关键字的写法一般用于声明全局变量
var (vname1 v_type1vname2 v_type2
)
package mainvar x, y int
var (  // 这种因式分解关键字的写法一般用于声明全局变量a intb booln,m ,z int
)var c, d int = 1, 2
var e, f = 123, "hello"//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"func main(){g, h := 123, "hello"println(x, y, a, b, c, d, e, f, g, h)
}

2.New函数

2.1介绍

Go 内置的new函数是另一种创建变量的方式,表达式new(T)创建一个未命名的 T 类型变量,初始化为 T 类型的零值,并返回其地址(类型为 *T)

2.2以创建int型为示例

下面两个newInt函数是等价的:

func newInt() *int {return new(int)
}
func main() {a := newInt()fmt.Println(a) //输出 :0xc0000161c0fmt.Println(*a) //输出 :0
}
func newInt() *int {var x intreturn &x
}
func main() {a := newInt()fmt.Println(a)  //输出 :0xc000102180fmt.Println(*a) //输出 :0
}

3. “…”

3.1介绍

在 Go 函数定义中,我们可以使用…表示可变参数,用于表示可以接受任意个数但相同类型的参数;
…T语法糖本质上代表的是一个切片,其元素类型为T。因此,…interface{}类型等价于[]interface{},这也是为什么Println函数可以接受任意数量,任意类型的参数原因。

3.2以fmt.Println为示例

Println函数我们可以称之为可变参函数,可变参函数具有以下特征:
(1)可变参必须定义在函数参数列表最后一个,也只能有一个可变参类型定义;
(2)函数调用时,可变参可以不填,此时函数内部会将其当做 nil 切片处理;
(3)可变参数必须是相同类型,如果需要不同类型就定义为 interface{}

func Println(a ...interface{}) (n int, err error) {}

3.3 "…"可用于初始化数组

    //形式1a := []int{1, 2, 5}fmt.Println(a)                 //输出 :[1 2 5]fmt.Println(reflect.TypeOf(a)) //输出 : []int//形式2b := [6]int{1: 1, 2: 2, 5: 6}fmt.Println(b)                 //输出 : [0 1 2 0 0 6]fmt.Println(reflect.TypeOf(b)) //输出 : [6]int//经验证,"..."创建的是数组,并不是切片,等效于形式2x := [...]int{1: 1, 2: 2, 5: 6}fmt.Println(x)                 //输出 : [0 1 2 0 0 6]fmt.Println(reflect.TypeOf(x)) //输出 : [6]intfmt.Println(x[5])              //输出 : 6m := [...]int{1, 2, 6}fmt.Println(m)                 //输出 : [1 2 3]fmt.Println(reflect.TypeOf(m)) //输出 : [3]int

4. for range

4.1介绍

可以使用 for range 来快速遍历可迭代对象,例如数组、切片、map、channel、字符串等

4.2for range遍历切片/数组/字符串的三种方式

a := []int{1, 2, 3}// 遍历一:不关心索引和数据的情况
for range a {
}// 遍历二:只关心索引的情况
for index := range a {fmt.Println(index)
}// 遍历三:关心索引和数据的情况
for index, value := range a {fmt.Println(index, value)
}

4.3for range遍历map的三种方式

m := map[int]string{1: "Golang", 2: "Python", 3: "Java"}
// 遍历一:不关心 key 和 value 的情况
for range m {
}// 遍历二:只关心 key 的情况
for key := range m {fmt.Println(key)
}// 遍历二:关心 key 和 value 的情况
for key, value := range m {fmt.Println(key, value)
}

4.4for range遍历channel的三种方式

ch := make(chan int, 10)// 遍历一:不关心 channel 数据
for range ch {
}// 遍历二:关心 channel 数据
for data := range ch {fmt.Println(data)
}

5.接收者方法

5.1介绍

在 Go 中,对于自定义类型 T,为它定义方法时,其接收者可以是类型 T 本身,也可能是 T 类型的指针 *T

5.2接收者为原类型时调用方法正常


type Instance struct{}func (ins Instance) Foo() string {return "123"
}
func main() {var a = Instance{}.Foo()fmt.Println(a) //输出123var b Instancec := b.Foo()fmt.Println(c) //输出123
}

5.3接收者为指针类型时直接调用方法失败

func (ins *Instance) Foo() string {return "123"
}
func main() {var a = Instance{}.Foo() //编译失败,cannot call pointer method Instance{}
}

5.4接收者为指针类型时直接调用方法成功

a值属于 Instance 类型,而非 *Instance,却能调用 Foo 方法,这是为什么呢?这其实就是 Go 编译器提供的语法糖:
当一个变量可变时,我们对类型 T 的变量直接调用 *T 方法是合法的,因为 Go 编译器隐式地获取了它的地址。变量可变意味着变量可寻址,因此,上文提到的 Instance{}.Foo() 会得到编译错误,就在于 Instance{} 值不能寻址

type Instance struct{}func (ins *Instance) Foo() string {return "123"
}
func main() {var a Instanceb := a.Foo() fmt.Println(b)//输出 : 123
}

http://chatgpt.dhexx.cn/article/JB0PeExb.shtml

相关文章

vue语法糖

vue语法糖 语法糖是指在不影响功能的情况下&#xff0c; 添加某种方法实现同样的效果&#xff0c; 从而方便程序开发。 1. v-bind v-bind&#xff0c; 可以省略 v-bind, 直接写一个冒号 “&#xff1a;” <!DOCTYPE html> <html lang"en"> <head>…

Python 之语法糖

目录 定义及意义 示例 赋值 索引与切片 条件表达式 map() 函数 with open() format() 函数 匿名函数 lambda 推导式 今天自学时听老师讲到“语法糖”&#xff0c;有点儿迷茫&#xff0c;赶紧忍住口水滴答的冲动&#xff0c;向度娘请教。 定义及意义 语法糖&#xff0…

java语法糖

概述 几乎所有的语言都涉及到语法糖&#xff0c;语法糖时啥呢&#xff1f;语法糖其实就是在开发中方便程序员用的一些语法&#xff0c;该语法和正常语法的区别就在于&#xff1a;语法糖在底层其时是不能够被一次性直接实现的&#xff0c;它们需要依靠一些技术或普通语法实现。当…

【python】python语法糖

python 语法糖 1. 什么是语法糖&#x1f36c; 语法糖是由编程语言提供的一种可以让我们写出来的代码在不影响语句执行的功能的条件下&#xff0c;能够让我们的代码看起来更简洁和美观的一种语法。 很多人刚开始接触语法糖的时候&#xff0c;总会说这样一句&#xff1a;“最讨厌…

Java 中的语法糖,真甜。

我把自己以往的文章汇总成为了 Github &#xff0c;欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 我们在日常开发中经常会使用到诸如泛型、自动拆箱和装箱、内部类、增强 for 循环、try-with-resources 语法、lambda 表达式等&#xff0c;我们只觉得用的很爽&…

Python语法糖系列

语法糖说明 语法糖&#xff08;Syntactic sugar&#xff09;&#xff1a;计算机语言中特殊的某种语法这种语法对语言的功能并没有影响对于程序员有更好的易用性能够增加程序的可读性简而言之&#xff0c;语法糖就是程序语言中提供[奇技淫巧]的一种手段和方式而已。 通过这类方…

什么是语法糖?Java中有哪些语法糖?

本文从 Java 编译原理角度&#xff0c;深入字节码及 class 文件&#xff0c;抽丝剥茧&#xff0c;了解 Java 中的语法糖原理及用法&#xff0c;帮助大家在学会如何使用 Java 语法糖的同时&#xff0c;了解这些语法糖背后的原理 1 语法糖 语法糖&#xff08;Syntactic Sugar&…

不了解这12个语法糖,别说你会Java!

阅读本文大概需要 10 分钟。 作者:Hollis 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理 语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英…

什么是语法糖(Syntactic sugar)?

大学时没选修编译原理这门课&#xff0c;不知道什么是语法糖&#xff0c;最近看React的官方文档才接触语法糖的概念&#xff0c;简单查了下资料记录下&#xff0c;以下是来自百度百科的解释&#xff1a; 语法糖&#xff08;Syntactic sugar&#xff09;&#xff0c;也译为糖衣语…

el-steps分布展示页面

<template><div class"app-container automation"><el-steps :active"active" finish-status"success"><el-step title"步骤 1"></el-step><el-step title"步骤 2"></el-step>&l…

038_Steps步骤条

1. Steps步骤条 1.1. Steps步骤条引导用户按照流程完成任务的分步导航条, 可根据实际应用场景设定步骤, 步骤不得少于2步。 1.2. Steps Attributes 参数 说明 类型 可选值 默认值 space 每个step的间距, 不填写将自适应间距。支持百分比。 number / string 无 无 d…

更改el-steps颜色样式

原样式&#xff1a; 目标样式如下&#xff0c;也不追求完全一致&#xff0c;至少得看得过去。 <style scoped>::v-deep .el-step__head.is-success {color: rgb(52, 158, 250);border-color: rgb(52, 158, 250); } ::v-deep .el-step__title.is-success {font-weight: …

vue使用steps步骤条,自定义内容

效果图 一、引入element ui steps <el-steps :active"caseHistoryData.length" finish-status"success" direction"vertical" ><el-step><template slot"description"></template></el-step> </el-…

steps.js 步骤条、时间轴

GitHub地址&#xff1a;https://github.com/fxss5201/steps 介绍 首先看一下目录&#xff1a; 1.0 文件夹和 2.0 文件夹非升级关系&#xff0c;两者仅是着重点方向不一致&#xff0c;1.0 主打双边显示&#xff0c;2.0 主打内容排序&#xff0c;一般功能的话两者均可满足。 …

CSS3中steps()动画的详解

原文作者&#xff1a;Joni Trythall 增修作者&#xff1a;Fegmaybe 一个是雪碧图的实现动画的steps效果。steps&#xff08;&#xff09;阶跃函数&#xff0c;是transition-timing-function和animation-timing-function两个属性的属性值&#xff0c;他是表示两个关键帧之间的动…

css【详解】steps()函数

steps(number, position)number 整数值&#xff0c;表示把动画分成了多少段。position 可选参数&#xff0c;表示动画跳跃执行是在时间段的开始还是结束。 —— start 在时间段的开头处跳跃 —— end 在时间段的结束处跳跃 动画效果见 https://demo.cssworld.cn/new/5/4-7.php…

steps函数--参数意思和用法

图片解释如下&#xff0c;参数意思和用法在代码的注释中 所引用图片共7帧&#xff0c;如下&#xff1a; 尺寸为200*1400&#xff0c;所以设置div为200*200&#xff0c;分为7帧&#xff0c;除去展示帧&#xff0c;需六次步骤跳转&#xff0c;原图如下&#xff1a; 代码&…

element的步骤条整合表单(steps+form)

先上效果图&#xff1a; element ui 组件库官网 使用步骤&#xff1a; 1、页面组合步骤 > 5步 定义出4个步骤&#xff08;看你自己需要几步&#xff09;定义form表单定义4个盒子对象active属性 > 1 到 4放置表单项设置上一步和下一步的按钮 <template>//第一步…

vue、Steps 步骤条、Steps 属性、vue Steps 所有步骤条样式、vue Steps 步骤条全部属性

vue、Steps 步骤条、Steps 属性、vue Steps 所有步骤条样式、vue Steps 步骤条全部属性 设计规则何时使用 代码演示1.基本用法2.迷你版3.带图标的步骤条4.步骤切换5.竖直方向的步骤条6.竖直方向的小型步骤条7.步骤运行错误8.点状步骤条9.自定义点状步骤条 APIStepsSteps.Step 设…

组件封装 - steps组件

首先, 我先来看看效果 steps 组件的封装和 tabs 组件还是相似的 都会去指定两个组件来完成(仿Element UI), 都会去使用 jsx 的语法 让其中一个组件去规定样式和排版, 另外一个组件去接收父组件传入的动态数据 但和面包屑组件还是有区别的(面包屑组件封装): 相同点都是使用两…