가끔 다른 사람의 Go 코드를 보면 포인터를 사용하는 사람도 있고, 사용하지 않는 사람도 있습니다. (추천 학습: go)
Person이라는 구조체 타입이 있다고 가정하고, 일부 메소드에서 func methodA를 사용하는 것으로 확인되었습니다(*person Person). 또는 구조체의 자체 메서드로 func *(person Person) methodA()를 사용합니다. 즉, person 구조체는 포인터를 사용하여 methodA를 직접 호출할 수 있습니다.
또는 맵 구조에서 var personMap map[string]*Person의 사용법을 볼 수 있습니다
Java에서 golang으로 전환하는 경우 쉽지 않을 수 있습니다. 이해하다. Java 세계에는 포인터가 없기 때문에 그냥 직접 전달해서 사용할 수 있습니다. 하지만 golang으로 갈 때는 주의할 점이 많습니다.
그럼 언제 사용해야 할까요? 어떤 곳에서는 왜 필요한가요?
경우에 따라 구조체에 값을 할당할 수 없습니다. 먼저 이 코드는 포인터를 사용하지 않습니다. 테스트를 위해 여러 개를 정의합니다. Object
type Person struct { //person结构体,包含年龄,名称,车 age int name string car Car } type Car struct { //person名下的车 name string //车的名字 } var personMap map[string]Person //一个存放person的map func setName(person Person, name string) { //给参数person设置名字 person.name = name } func (person Person) setName(name string) { //设置名字 person.name = name } func printName(person Person){ //打印person的名字 fmt.Println(person.name) } func (person Person)printName(){ //结构体person自己支持打印名字 fmt.Println(person.name) }
그런 다음 기본 메소드를 작성하고 인쇄된 결과를 코드에 주석으로 표시하며 할당이 실패하는 경우가 많습니다.
func main() { person := Person{} fmt.Println(person) //{0 {}} person.age = 12 person.name = "小明" person.car = Car{"宝马"} fmt.Println(person) //{12 小明 {宝马}},正常赋值给person变量,因为这是在方法里面的变量 setName(person, "小红") fmt.Println(person) //{12 小明 {宝马}},小红赋值失败,传递给setName方法的person没有赋值成功 person.setName("小红") fmt.Println(person) //{12 小明 {宝马}},person自己setName,还是失败 personMap = make(map[string]Person) personMap["test"] = person person = personMap["test"] person.name = "小红" fmt.Println(person) //{12 小红 {宝马}},从map中取出person,给小红赋值成功 for _, value := range personMap { //遍历map fmt.Println(value)//{12 小明 {宝马}},打印的还是小明,而不是小红,说明上面personMap["test"]对象赋值失败 } }
다음으로 포인터를 사용하도록 변경합니다
type Person struct { age int name string car Car } type Car struct { name string } var personMap map[string]*Person func setName(person *Person, name string) { person.name = name } func (person *Person) setName(name string) { person.name = name } func printName(person Person){ fmt.Println(person.name) } func (person Person)printName(){ fmt.Println(person.name) }
메인 메소드를 수정하고 & 주소 문자를 사용합니다 #🎜🎜 ## 🎜🎜#func main() {
person := Person{}
fmt.Println(person) //{0 {}}
person.age = 12
person.name = "小明"
person.car = Car{"宝马"}
fmt.Println(person) //打印{12 小明 {宝马}}
setName(&person, "小红")
fmt.Println(person) //{12 小红 {宝马}}, 成功赋值!
person.setName("小黑")
fmt.Println(person) //{12 小黑 {宝马}}, 成功赋值!
personMap = make(map[string]*Person)
personMap["test"] = &person
person = *personMap["test"]
person.name = "小兰"
fmt.Println(person) //{12 小兰 {宝马}},成功赋值!
for _, value := range personMap {
fmt.Println(value) //&{12 小兰 {宝马}},读取的也是正确的小兰
}
}
따라서
포인터를 사용해야 한다는 결론을 내릴 수 있습니다. 주소가 맵에서 구조체의 변수를 수정해야 하는 경우에도 구조체 주소를 맵의 값으로 사용해야 합니다
구조만 읽는다면 변수를 사용하지 않고 직접 읽을 수 있습니다.*type 여기에 있는 유형 변수는 주소를 저장하기 위해 &type을 사용해야 합니다. 주소를 얻으십시오.
위 내용은 golang은 포인터를 사용할 수 없나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!