Golang Go语言中短声明与长声明相互转换问题

发布于 1周前 作者 itying888 来自 Go语言

一般的短声明和长声明可以相互转换,例如 var x intx := 0 等价。 但有些好像无法完全等价转换?

var px *int  // 空指针
px := new(int)  // 不是空指针,分配了内存
// (如何用短声明得到空指针?)
var w io.Writer
var a interface{}
// (interface 类型的空表达式是什么...如何写成短声明)
var s []int  // 这样底层数组的地址是 0x0 (slice header 的数组指针为空?)
s := []int{}  // 这样底层数组的地址是 0x5168d0,类似一个容量为 0 的数组 (s := [0]int)
// 如何用短声明达到长声明的效果..
var m map[int]int  // nil map
m := map[int]int{}  // 不是 nil map,可以添加数据
// 怎样用短声明得到一个 nil map ?

Golang Go语言中短声明与长声明相互转换问题

更多关于Golang Go语言中短声明与长声明相互转换问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

短声明就是为了初始化,某些场景长声明=短声明是因为长声明默认初始化了,一般是基础类型。
你列的几种场景都不能等价,类似的还有 channel

更多关于Golang Go语言中短声明与长声明相互转换问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


带了等于号就是赋值了啊,var 的定义只有类型声明的

所谓短声明,就是声明并负值。原则上与长声明不等价,之所以会出现结果相同的情况,只是由于偶然。

比如 var x int 和 x := 0 等价,是因为你偶然地对 x 负值 0,如果你写 x := 1,那就不等价了。注意,不是因为用了短声明而等价,而是因为偶然负值了 0 所以才等价。

啊…谢谢,感觉好不爽…很分裂的感觉
interface{} 的那个例子难道也没有短声明的等价吗?

px := (*int)(nil)
a := (interface{})(nil)
s := ([]int)(nil)
m := (map[int]int)(nil)

啊!原来这样类型转换也可以。
<br> s := ([]int)(nil)<br> fmt.Printf("addr_s: %p addr_s_arr: %p content_s:%v len/cap_s:%v %v\n", &amp;s, s, s, len(s), cap(s))<br>
addr_s: 0xc42006e060 addr_s_arr: 0x0 content_s:[] len/cap_s:0 0

谢谢…

(说句题外话,Go 的 nil 也感觉怪怪的…)

你理解错了短声明 与长声明了。
var x int 和 x := 0 完全不等价, 之所以等价, 是因为 var x int 里,x 未定义 时,go 刚好给你默认设置为 0 而已。

两者可以等同于 C 语言的:
int x;

int x = 0;
很明显,x 是未定义的,可以是任何值。 同理,任何长声明都是定义一个变量, 而短声明是定义并赋值一个变量。

谢谢从定义角度给出的说明…
的确,它们的定义是不一样的…只是在某些情况下实际效果一样。

我只是想寻求一种尽量多使用短声明的写法…

在Go语言中,变量的声明分为短声明和长声明(或称为显式声明)两种形式,它们各自有不同的使用场景和语法规则,但不存在直接的“相互转换”问题,因为这两种声明方式在语义和用途上是有所区别的。

  1. 短声明:使用:=操作符,只能在函数内部使用,用于声明并初始化局部变量。短声明会自动根据右侧表达式的类型推断变量的类型。例如:x := 10

  2. 长声明(显式声明):使用var关键字,可以在函数内部或包级别(全局变量)使用。需要先声明变量类型,然后再进行初始化(如果需要)。例如:var x int = 10,或者仅声明类型不初始化:var y int

“转换”理解

  • 如果你在函数内部需要将一个短声明的变量“转换”为长声明形式,实际上你需要重新用var关键字声明一个同类型的变量,并将短声明变量的值赋给它。
  • 反过来,如果你有一个长声明的变量,并希望在函数内部以更简洁的方式使用它(类似短声明),你只需直接使用该变量名(因为它已经在作用域内)。

总之,短声明和长声明是Go语言提供的两种不同变量声明方式,它们之间没有直接的转换机制,但可以通过赋值和作用域管理来实现类似的效果。

回到顶部