Golang 不可寻址

前言
  1. 不可寻址: 找不到内存地址
  2. 找不到内存地址就无法调用带指针的方法
临时变量不可寻址

setName2 报错,由于临时变量不可寻址,无法调用指针方法

package main

type exp struct {
	data string
}

type exp2 struct {
	data string
}

func getExp() exp {
	return exp{}
}

func getExp2() exp2 {
	return exp2{}
}

func (e exp) setName(name string) {
	e.data = name
}

func (e *exp2) setName2(name string) {
	e.data = name
}

func main() {
	getExp().setName("name")
    // 此处报错
	getExp2().setName2("name")
}

image.png

将临时变量赋值给变量,变为可寻址,解决指针调用问题

package main

type exp struct {
	data string
}

type exp2 struct {
	data string
}

func getExp() exp {
	return exp{}
}

func getExp2() exp2 {
	return exp2{}
}

func (e exp) setName(name string) {
	e.data = name
}

func (e *exp2) setName2(name string) {
	e.data = name
}

func main() {
	getExp().setName("name")
	//临时变量赋值变为可寻址
	ex := getExp2()
	ex.setName2("name")
}

字面量
  1. ** struct,数组,map,slice 字面量可寻址**
  2. ** 其它类型字面量都不可寻址**
package main

import "fmt"

type a struct {
}

func main() {
	fmt.Println(&(123)) //invalid operation: cannot take address of 123 (untyped int constant)
	// 字面量数组可寻址
	fmt.Println(&([]int{1, 2, 3}))
	// 字面量切片可寻址
	fmt.Println(&([3]int{1, 2, 3}))
	// map字面量可寻址
	fmt.Println(&(map[string]string{"1": "2"}))
	// struct 字面量 可寻址
	fmt.Println(&(a{}))
}

字符串的索引和切片
package main

import "fmt"

func main() {
	exp := "abc"
	fmt.Println(&exp[0])   //字符串索引不可寻址
	fmt.Println(&(exp[:])) // 字符串切片不可寻址

	exp2 := "def"
	a := exp2[0]
	b := exp2[:]
	fmt.Println(a)
	fmt.Println(b)
}

数组不可寻址的情况
  1. 字面量
package main

import "fmt"

func main() {
	//字面量数组的索引不可寻址
	fmt.Println(&([3]int{0, 1, 2}[0]))
	//字面量数组的切片结果不可寻址
	fmt.Println(&([]int{0, 1, 2}[:]))

	// 非字面量的数组索引可寻址
	a := [3]int{1, 2, 3}
	// 可寻
	fmt.Println(&(a[0]))
	// 切片不可寻
	fmt.Println(&(a[:]))
}

常量不可寻址
package main

import "fmt"

const ex = "ex"

var ex2 = "ex2"

func main() {
	fmt.Println(&ex2)
	fmt.Println(&ex) //invalid operation: cannot take address of ex (untyped string constant "ex")
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值