​golang的变量定义为什么还没有python简洁?

mb5fdb133c76a49 · 2021-03-08 21:33:39 · 1146 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2021-03-08 21:33:39 的文章,其中的信息可能已经有所发展或是发生改变。

golang的变量定义为什么还没有python简洁?

今天的内容其实不能算一篇文章,而是学习golang时遇到的一个比较有意思的问题。欢迎大家指正批评

最近在深度研究k8sdocker,期间发现源码是golang。无奈,只好乘机把golang也学了。

我以前是写python和前端(vue,element,ajax,jquery,css,h5小程序...等),在学习golang时,发现其变量声明很不优雅。例子如下:

图片switch结构体

这里有两个设计理论可能不够优雅:

  • 疑问1:switch结构体

switch 的 os变量声明后,还在再跟一个os,再跟case结构体,不然会报语法错。

当然了,还有另外一种写法:先声明os, 再 switch os {...}

  • 问题2:变量声明

关于go的变量声明, go作为新起之秀,为什么不隐式声明,非得 :=这种方式呢?像python 甚至 shell 声明变量的方式如下:i,j = 42, 2701go 的声明方式:  i, j := 42, 2701

多一个:(冒号)不是增加了语言的复杂度吗,设计上还不如python优雅, 有什么其它原因?


大家也可以想一想,再向后翻看答案 .

.

.

.

.

.

.

. . . . . . . . . . .

go是强类型语言,它不是python这种弱类型的脚本语言。所以它的赋值和初始化本应该像c++一样提前先声明类型才能使用。但为了兼顾易用性,:=go提供的赋值和初始化的语法糖。python这种弱类型语言可以不用先声明类型,它牺牲了运行效率,提高了开发效率

这是老司机老章给出的答案,很专业哦!

当然了,作为golang小白,我还是有一丝丝疑惑啦

这个和效率高低有多大关系呢?go只是少了编译的过程。变量的声明和调用方式,如果go还是使用=声明,只是在C实现的时候做一层转化,也有同样的效果吧



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:mb5fdb133c76a49

查看原文:​golang的变量定义为什么还没有python简洁?

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1146 次点击  
加入收藏 微博
8 回复  |  直到 2021-03-10 22:34:05
lotuso
lotuso · #1 · 4年之前

switch是结构体?别逗了,回头去看看基础

LintP
LintP · #2 · 4年之前
switch runtime.GOOS{
case ...
}
xian9Yu
xian9Yu · #3 · 4年之前
LintPLintP #2 回复

```go switch runtime.GOOS{ case ... } ```

我刚也在想能直接使用的为什么还要创建一个新变量

xian9Yu
xian9Yu · #4 · 4年之前

不是不简洁,而是被用复杂了

zzustu
zzustu · #5 · 4年之前
LintPLintP #2 回复

```go switch runtime.GOOS{ case ... } ```

个人认为楼主的不是这个意思,这里runtime.GOOS只是一个常量,所以调几次都是一个结果,如果不是runtime.GOOS而是一个方法,比如下面这样运行结果可能会不一样:

switch now := time.Now(); now {
default:
    fmt.Print(now)
}
switch time.Now() {
default:
    fmt.Print(time.Now())
}

我不知道GET到了楼主的点没,但是我也不懂这一块,不知道解释。

xieccc
xieccc · #6 · 4年之前

作为强类型语言,用 := 进行智能化类型,已经算作语法糖了。。。毕竟是要提示这里是自动判断变量类型。反而用 = 会令人误解

LintP
LintP · #7 · 4年之前
zzustuzzustu #5 回复

#2楼 @LintP 个人认为楼主的不是这个意思,这里`runtime.GOOS`只是一个常量,所以调几次都是一个结果,如果不是`runtime.GOOS`而是一个方法,比如下面这样运行结果可能会不一样: ```go switch now := time.Now(); now { default: fmt.Print(now) } ``` ```go switch time.Now() { default: fmt.Print(time.Now()) } ``` 我不知道GET到了楼主的点没,但是我也不懂这一块,不知道解释。

这两个结果肯定不一样啦

avtion
avtion · #8 · 4年之前

=就是赋值,:=海象运算符就是短变量声明,文章提出的问题就像在问=为什么不表示equal而是assigns,==表示equal?

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传