Brandon Belt led the Giants with a 4-for-5 day, raising his spring average to .526 (10-for-19). His ninth-inning home run provided the game's final margin.
The Royals, 8-0-1, are the only unbeaten team in Spring Training.
Right-hander Jeremy Guthrie, the last of the Royals' rotation regulars to make a start this spring, got a rough indoctrination. In the first inning, he was banged for three straight hits -- singles by Joaquin Arias and Belt, and Hector Sanchez's two-run triple into the right-field corner.
Guthrie survived a one-out double by Wilson Valdez in the second and finished his outing with two runs on four hits.
"I wanted to make sure I was able to move the fastball around," Guthrie said. "For the most part, I was able to go back and forth; I was just up in the zone, so in the first inning, those guys put some good swings on some balls that were thigh-high and really hittable pitches."
The Royals bounced back. Hosmer doubled home David Lough, who singled, in the third inning. They scored three runs in the fourth against Chris Heston, with Moustakas following Salvador Perez's single with a home run to right field. Lorenzo Cain doubled and scored as left fielder Juan Perez dropped Johnny Giavotella's fly ball for an error.
In the fifth, Hosmer homered into the left-field bullpen off Heston for a 5-2 lead. The Royals added four runs in the sixth with Anthony Seratelli contributing a two-run triple.
Gary Brown pounded a two-run homer in the Giants' seventh inning and they threatened to do more against Noel Arguelles, loading the bases with one out. But Arguelles worked out of the jam.
Up next: The Giants host the D-backs at 12:05 p.m. PT on Sunday at Scottsdale Stadium, with left-hander Barry Zito making his second Cactus League start. San Francisco will face second-year Arizona pitcher Josh Collmenter.
Dick Kaegel is a reporter for MLB.com. This story was not subject to the approval of Major League Baseball or its clubs.