前言
- 不可寻址: 找不到内存地址
- 找不到内存地址就无法调用带指针的方法
临时变量不可寻址
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")
}
将临时变量赋值给变量,变为可寻址,解决指针调用问题
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")
}
字面量
- ** struct,数组,map,slice 字面量可寻址**
- ** 其它类型字面量都不可寻址**
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)
}
数组不可寻址的情况
- 字面量
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")
}